G - Max Sum Plus Plus 线性dp

G - Max Sum Plus Plus 线性dp

#include <bits/stdc++.h>
#define id first
#define val second
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
ll dp[maxn],a[maxn],pre[maxn];
//dp[i][j]表示前面i个数,分成j组的最大和,第i个数一定在数组中
//所以最后这个dp[j] 表示的是一定包括遍历到当前位置i的最大和
//pre[j] 表示一定不包括当前位置i的最大和
//所以最后pre[m]和dp[m] 要取一个最大值,因为dp[m]是一定包括a[n]的,而pre[m]是一定不包括a[n]的
int main(){
    int m,n;
    while(~scanf("%d%d",&m,&n)){
        for(int j=0;j<=n;j++) dp[j]=-inf64,pre[j]=-inf64;
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        pre[0]=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=min(i,m);j++){
                pre[j]=max(pre[j],dp[j]);
                dp[j]=max(pre[j-1],dp[j])+a[i];
            }
        }
        printf("%lld\n",max(pre[m],dp[m]));
    }
    return 0;
}

posted @ 2020-07-07 20:56  EchoZQN  阅读(133)  评论(0)    收藏  举报