最大子连续序列之和

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

猜你喜欢

转载自blog.csdn.net/qq_36428171/article/details/78116483