题目大意:求关于输入的n个数的最大m子段。
#include <stdio.h>
__int64 f[2][1000000];//第x个子段最大和和(x-1)个子段最大和有关,运用滚动数组0->1->0...
__int64 v[1000000];
int main()
{
int i,j,k,n,m;
__int64 max;
while(scanf("%d %d",&m,&n)!=EOF)
{
f[0][0]=f[0][1]=0;
for(i=1;i<=n;i++)
{
scanf("%I64d",&v[i]);
f[0][i]=f[1][i]=0;//用memset函数赋初值会超时
}
max=-999999;
k=0;
for(i=1;i<=m;i++)
{
max=f[1-k][i-1];//(i-1)段不可能被分成i段,从(i-1)开始可以减少时间复杂度
f[k][i]=max+v[i];
for(j=i+1;j<=n;j++)
{
if(f[1-k][j-1]>max)
max=f[1-k][j-1];
f[k][j]=f[k][j-1]>max?f[k][j-1]:max;
f[k][j]+=v[j];
}
k=1-k;
}
k=1-k;
max=-9999999999;
for(i=m;i<=n;i++)
{
max=f[k][i]>max?f[k][i]:max;
}
printf("%I64d\n",max);
}
return 0;
}