Max Sum Plus Plus HDU - 1024 dp

题目链接:https://vjudge.net/problem/HDU-1024#author=SWUN2018
转自:https://www.cnblogs.com/zhengguiping–9876/p/5349720.html
题意:给一串序列,要求找几段互不相交的区间,让它们的和最大。
思路:dp【i】【j】表示前j个数取i段时的答案(j个数不一定全取)并且是以第j个数结尾。maxx表示前j-1个数取i-1段的最大值。在寻找a【j】时,要么a【j】单独作为一段(重新开始),要么a【j】作为结尾并入前面。转移方程为dp【i】【j】=max(dp【i】【j-1】+a【j】, maxx+a【j】);

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn=1e6+5;
int a[maxn],dp[2][maxn];
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1; i<=m; i++)
        {
            scanf("%d",&a[i]);
        }
        memset(dp,0,sizeof(dp));
        int maxx,ans,k=0;
        for(int i=1; i<=n; i++)
        {
            k^=1;
            dp[k][i]=dp[k^1][i-1]+a[i];//分成i段时,第i个数只能选择自成一段
            maxx=dp[k^1][i-1];
            ans=dp[k][i];
            for(int j=i+1; j<=m; j++)
            {
                maxx=max(maxx,dp[k^1][j-1]);
                dp[k][j]=max(maxx+a[j],dp[k][j-1]+a[j]);
                ans=max(dp[k][j],ans);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(DP)