HDU 1024 Max Sum Plus Plus

解题思路:

这是求不想见子段最大和。

dp[i][j]:前j个数分成i组的最大和。

本题的解题策略是:

                 第j个数单独成一组,还是和前面前面的数成一组

       dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j])  0<k<j;

实现代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int MAXN=1000010;
const long long INF=1E40;

long long dp[MAXN],mm[MAXN];
long long a[MAXN];


int main(){
    int n,m;
    while(scanf("%d%d",&m,&n)!=EOF){
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]);

        memset(dp,0,sizeof(dp));
        memset(mm,0,sizeof(mm));
        long long maxSum=0;

        for(int i=1;i<=m;i++){
            maxSum=-INF;
            for(int j=i;j<=n;j++){
                dp[j]=max(dp[j-1]+a[j],mm[j-1]+a[j]);
                mm[j-1]=maxSum;
                maxSum=max(maxSum,dp[j]);
            }
        }

        cout<<maxSum<<endl;
    }
}

 

posted on 2017-03-20 17:30  mkfoy  阅读(111)  评论(0编辑  收藏  举报

导航