最大子连续序列之和

来源:互联网 发布:网络推广有几种方法 编辑:程序博客网 时间:2024/05/18 21:43

问题简介:
求最大连续序列之和。例如:{-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将最大的那个状态保存
即求出了最大子序列之和

原创粉丝点击