问题描述:最长n段连续子序列和
1 3 1 2 3 2 6 -1 4 -2 3 -2 3
6 8
算法思想:
dp[i][j]保存前j个元素(包括j)分成i段最长连续子序列和
则有dp[i][j]=max(dp[i][j-1]+num[j],max(dp[i-1][t]+num[j])) 0<t<j
#include <iostream>
using namespace std;
int *s;
int m,n;
int maxL;
int *pre,*now;
int main()
{
freopen("C:\\in.txt","r",stdin);
while(scanf("%d %d",&m,&n)!=EOF){
s=new int[n+1];
pre=new int[n+1];
now=new int[n+1];
for(int i=0;i<=n;i++){now[i]=0;pre[i]=0;}
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
}
for(int i=1;i<=m;i++){
maxL=-0x7fffffff;
for(int j=i;j<=n;j++){
now[j]=(now[j-1]>pre[j-1]?now[j-1]:pre[j-1])+s[j];
pre[j-1]=maxL;
if(maxL<now[j])
maxL=now[j];
}
}
printf("%d\n",maxL);
delete[] s;
}
return 0;
}原文:http://blog.csdn.net/starcuan/article/details/18893517