求最大子序列的和( 动态规划dp)

 只要上一个子序列最大和为正,那么无论当前值的正负,都会与当前的相加,这样以当前值结尾的子序列最大和就会增大。(一个正数 加一个 正数2 或者负数   那么都会比这个正数2 或 负数 原来要增大(此时就是站在新加的这个数的角度看子序列的和,一定会增大),同理,一个负数加任何一个数,都会使这个数减小,因此当前一子序列最大和小于零时,我们就归零它了,相当于是不加任何数,而保留当前位置值本身)

上面这段话来自http://alorry.blog.163.com/blog/static/6472570820123801223397/,感觉不错就引用过来了

代码中的sum其实就是S(i),每一次循环的sum都代表一个S(i)

#include <iostream>

using namespace std;

int a[100005];
int main()
{
    int t,n,ans,sum;
    cin>>t;
    while(t--)
    {
        cin>>n;
        ans=-1000000;
        sum=-1000000;
        for(int i=0; i<n; i++) cin>>a[i];
        for(int i=0; i<n; i++)
        {
            if(sum<0)
                sum=a[i];
            else 
                sum+=a[i];
            if(ans<sum)
                ans=sum;
        }
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40733911/article/details/81208623