HUD-1024-Max Sum Plus Plus DP+滚动数组

来源:互联网 发布:centos 7 mirror 编辑:程序博客网 时间:2024/05/17 14:15

题意
给定1-N个数 求m个连续不相交区间的最大值

思路
用DP求解
DP[i][j]表示前j个数分为i块的最大值
可得DP方程

DP[i][j]=max(DP[i][j-1]+a[j],max(DP[i-1][t])+a[j])

DP[i-1][t]表示i-1个分割的最大值
由于数据大 不能用二维数组 改用滚动数组
在i一定情况下 用b[j]表示DP[i][j]
pre[j]表示DP[i-1][t]中的最大值
所以DP方程可以改为:

b[j]=max(b[j-1]+a[j],pre[j-1]+a[j])//

#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <string.h>const int N = 1000005;const int Max = -9999999999;int a[N];//数组Sint b[N];//前J个最大和 带a[j]int pre[N];//前J个最大 不带a[j]using namespace std;int main(){    long long int m,n;    int summax;   while(cin>>m>>n){    b[0]=0;    memset(pre,0,sizeof(pre));    for(int i=1;i<=m;i++)    {        summax = Max;        for(int j=i;j<=n;j++)        {            if(i==1)                scanf("%d",&a[j]);            b[j] = max(b[j-1],pre[j-1])+a[j];            pre[j-1]=summax;            summax = max(summax,b[j]);//循环到i++         }    }    cout<<summax<<endl;    }    return 0;}
0 0