最大连续子序列之和

来源:互联网 发布:火烧赤壁的网络意思 编辑:程序博客网 时间:2024/05/18 23:13

参考   http://blog.csdn.net/sgbfblog/article/details/8032464

 

刚开始只想到用枚举,但很慢。

没有想到用分治,虽然也比较慢。

学习之后写了一下动态规划的代码。

 

dp[i]表示包含a[i]在内的前i个数里最大连续子序列和

 

设置r, l 表示左右节点

 

设置 z,y 表示最长序列左右节点。

 

 


dp[i-1]<0时,舍弃,重新开始,令dp[i]=a[i]


dp[i-1]>=0时,dp[i]=dp[i-1]+a[i]


每轮比较当前dp[i]和max,随时更新。


全部初始化为1,重新开始时更新l,r为i,正常前进时只更新r为i,需要更新max时把当前l,r给z,y。

 

多组输入,输入0时结束。

输出最大序列和及起始终止位置。

 

代码如下

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>

using namespace std;
int a[100] ;
int dp[100] ;

int main()
{
    int i,n;
    while (scanf("%d",&n)!=EOF)
    {
        if(n==0)

            break;

        int r = 1,l = 1,z =1 ,y = 1;
        int maxn = 0;
        int b = 0;

        memset(a,0,sizeof(a));
      
        memset(dp,0,sizeof(dp));


        for (int i  = 1; i <= n; i++)
        {
            scanf("%d",&a[i]);

        }
        maxn = a[1];

        dp[1] = a[1];

        for(int i = 2; i <= n; i++)
        {
            if(dp[i-1] < 0)
            {
                dp[i] = a[i];

                l = i;

                r = i;
            }
            else
            {
                dp[i] = dp[i-1] + a[i];

                r = i;
            }

            if(dp[i] > maxn)
            {
                maxn = dp[i];
                z = l;
                y = r;
            }
        }

        printf("%d %d %d\n",maxn,l,r);

    }
    return 0;

}

 


 

原创粉丝点击