HDU 1024 Max Sum Plus Plus DP+滚动数组

来源:互联网 发布:室内定位 指纹算法 编辑:程序博客网 时间:2024/05/18 10:28

题目链接:Max Sum Plus Plus

状态转移方程

dp[i][j]表示将前j个元素分成i段。
dp[i][j]=max{ dp[i][j-1]+a[i] , dp[i-1][k]+a[i] , (i-1<=k<j) } (i<=j<=n-m+i)

代码

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN=1000001;int m,n;ll dp[2][MAXN];int a[MAXN];ll Max(ll a,ll b){    if(a>b) return a;    else return b;}int main(){    while(scanf("%d%d",&m,&n)!=EOF)    {        memset(dp,0,sizeof dp);        memset(a,0,sizeof a);        int t=1;        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);        }        for(int i=1;i<=m;i++)        {            dp[t][i]=dp[1-t][i-1]+a[i];            int mmax=dp[1-t][i-1];            for(int j=i+1;j<=n-m+i;j++)            {                mmax=Max(dp[1-t][j-1],mmax);                dp[t][j]=Max(mmax,dp[t][j-1])+a[j];            }            t=1-t;        }        t=1-t;        ll res=-1111111111111;        for(int i=m;i<=n;i++)            if(res<dp[t][i])res=dp[t][i];        printf("%d\n",res);    }    return 0;}
原创粉丝点击