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

本文详细解析了一种用于寻找数组中具有最大和的连续子序列的算法实现过程。通过动态规划思想,该算法能够有效地处理包含正数和负数的数组,并提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 只要上一个子序列最大和为正,那么无论当前值的正负,都会与当前的相加,这样以当前值结尾的子序列最大和就会增大。(一个正数 加一个 正数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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值