问题简介:
求最大连续序列之和。例如:{-1,5,6,-10,15,-9,8},最大连续子序列和为{5,6,-10,15},和为16。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1000;
int a[maxn]; //存入序列
int b[maxn]; //存储状态
int main()
{
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d",&a[i]);
} //录入样例{-1,5,6,-10,15,-9,8}
b[0] = a[0];
int ans = b[0];
for(int i = 1;i<m ; i++)
{
b[i]=max(a[i],b[i-1]+a[i]); //讲解见a
if(ans<b[i])
ans=b[i]; //ans储存最大序列之和
}
printf("max %d\n" , ans);
for(int i = 0;i<m;i++) //展现状态b[i]每个位置状态
printf("b[%d]=%d\n",i,b[i]);
return 0;
}
- a
状态转移方程
b[i]=max(a[i],b[i-1]+a[i])
b[i]每个状态为当前序号之前的最大子序列之和,max()函数将进行选择:
1.删除前一状态 a[i] 例如:b[1]=max(a[1],a[1]+b[0]);
2.保留前一个状态 b[i-1]+a[i] 例如:b[2]=max(a[2],a[2]+b[1]);
最后用ans将最大的那个状态保存
即求出了最大子序列之和