dp最大子段和问题

一、最大一段子段和问题
输入一列数字,输出这一列数字的最大子序列的和
首先问题分析
状态设计:
dp[i] (1 <= i <= N) 表示以 a[i] 结尾的最大连续子段和。
显然,dp[i] >= 0 (1 <= i <= N)
求解目标:
max{dp[i]} (1 <= i <= N)
状态转移方程:
dp[i] = max{a[i],0} (i = 1)
dp[i] = max{dp[i-1] + a[i], 0} (2 <= i <= N)
注意,当a[i]>dp[i-1]+a[i]时,则表明前面之和为负数,可以忽略,让之后的累加从当前a[i]开始进行累加。
二、最大二段子段和问题
考虑到最大二段子段和问题和一段子段和问题有些类似,则考虑能否用求最大一段子段和问题求该问题的解
状态设计:
dpL[i] 表示以 a[i] 结尾的最大连续子段和。
dpL[i] = max{∑a[x…i], 0},1 <= x <= i <= N
显然,dpL[i] >= 0 (1 <= i <= N)
dpR[i] 表示以 a[j] 开始的最大连续子段和。
dpR[j] = max{∑a[j…y], 0},1 <= j <= y <= N
显然,dpR[j] >= 0 (1 <= j <= N)
求解目标:
max{max{dpL[k]} + max{dpR[l]}} (1 <= k < l <= N)
状态转移方程:
dpL[i] = max{a[i],0} (i = 1)
dpL[i] = max{dpL[i – 1] + a[i], 0} (2 <= i <= N)
dpR[j] = max{a[j],0} (j = N)
dpR[j] = max{dpR[j + 1] + a[j], 0}(1 <= j <= N-1)
三、最大M段子段问题
求给定一列数字最大M段子段和
状态设计:
dp[i][j]表示只由前 j 项组成的序列中以 a[j] 结尾的最大 i 子段和
求解目标:
dp[M][N]
状态转移方程:
d[i][j]表示前j项中i个字段和的最大值d[i][j]=max{d[i][j-1]+d[i-1]t}+num[j];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值