最大子序列的和

动态规划思想解最大子序列的和

1.计算一个整形数组的最大子序列之和
例如:给定一个数组如a[] = {4,-3,5,-2,-1,2,6,-2},计算它的和最长的子序列(这个是9,从a[1]到a[7])。

思路:记a[0]到a[i]的子序列的和最大值为max(i),则方程如下:

max(0)=d[0]

max(1)=d[1],d[0]+d[1],max(0),d[0]<0d[0]>0d[1]<0

max(2)=d[2],d[1]+d[2],max(1),d[1]<0d[1]>0max(1)

max(3)=d[3],d[1]+d[2],max(1),d[2]<0d[2]>0max(2)
.......

max(n)=d[n],d[n1]+d[n],max(n1),d[n-1]<0d[n-1]>0max(n-1)

通过上述分析,显然可以发现这个问题与包含前一值的最大子序列的值有关。这个最大子序列的值也显然是可以动态生成的,记包含第i项的值最大子序列为num[i],其动态方程为:

num[0]=d[0]

num[1]={d[1],d[1]+num[0],d[0]<=0d[0]>0

...............

num[n]={d[n1],d[n]+num[n1],num[n-1]<=0num[n-1]>0

通过上述分析,我们可以得出思路了。循环动态规划(这是联机算法,是理想算法)得到num[i-1]的值,然后观察其值,若大于0(若小于0可以将num[i]的值置0)就与d[i]值相加,然后将结果与max(i-1)比较,更新max(i)的值。

按照这个思路的代码如下所示:

public int getSumLarge_dymatic(int i,int j){
int sum = a[i];
int maxSum = a[i];
for (int m=i+1; m<=j;++m){
if (sum<0){
sum = 0;
}else {
sum += a[m];
}
if (maxSum < sum){
maxSum = sum;
}
}
return maxSum;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值