题意
给定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];//数组S
int 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;
}