Max Sum(最大子段和问题)

本文探讨了最大子段和问题,给出了如何找出序列中元素和最大的子序列的方法。通过动态规划(dp)策略,公式表示为:dp(i) = max(dp(i-1) + ans(i), ans(i))。文章以HDU1003和POJ2479两道题目为例,详细解释了解决这类问题的步骤。在HDU1003中,通过维护变量sum和记录起点head来更新最大子段和。而在POJ2479中,需要找到两个互不相交子序列的和的最大值,可以通过两次遍历分别计算正序和逆序的dp值来解决。" 131027869,10385585,Python升序排序:Lambda函数的秘密,"['Python', '算法', '编程技巧']
摘要由CSDN通过智能技术生成

最大子段和:给定一个序列(元素可正可负),找出其子序列中元素和最大的值。

我们用dp(i)表示序列中以元素ans(i)结尾的序列的最大子段和,那么有:dp(i)=max(dp(i-1)+ans(i),ans(i));

#define INF 999999999
int solve(int ans[],int n)  
{  
    dp[0]=0;  
    int nmax=-INF;  
    for(int i=1;i<=n;i++)  
    {  
        dp[i]=max(dp[i-1]+ans[i],ans[i]);  
        nmax=max(nmax,dp[i]);  
    }  
    return nmax;  
}  


首先来看一道比较基础的最大子段和问题--HDU1003   Max Sum:

题目大意:给定一个序列,让求出此序列的最大子段和,并输出该子序列在原序列中的位置。

这里我们用变量sum来代替dp()数组,如果sum+a(i)<a(i),就更新sum的值,并重新纪录head的值,如果sum+a(i)>=a(i),则只需更新sum的值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值