HDU 1024 解题思路

题目:

给出S1,S2。。。。Sn,这一个序列,把这个序列分成m段,使这m段的和最大,求出这个最大值是多少

思路:

很明显的dp问题,画一个表格(代表二维数组dp),dp[i][j]表示 :前j个数字分成i段的序列和最大是多少。

对于任意的 i , j , dp[i][j] 的值无非取两种:

第一种:前j-1个数字分成i组 , 就已经最大了,那么就取dp[i][j-1](当然i<j,如果i=j就是第二种情况了),这是不取第j个数字的情况,表达式为:dp[ i ][ j ] = dp[ i ][ j -  1]

第二种:如果取第j个数字作为单独一组,那么就要从前 j 个数字中找出 i-1组(因为第j个数字单独作为一组,那么前面就要有i-1组),取前 j 个数字中如果分成 i - 1 组 中最大的,再加上当前数字,那么就是当前dp[ i ][ j ]的值。表达式就是dp[ i ][ j ] = dp[ i - 1 ] [ k ] + a[ j ](其中k从 i 到  j )

 

所以综上所述, 最后的表达式就是 dp[ i ][ j ]  =  Max( dp[ i ][ j - 1] ,dp[ i - 1 ] [ k ] + a[ j ] ),如果考虑代码实现,因为题目中的数据量比较大,所以在实现的时候需要进一步优化,代码稍长,就不在这里粘贴了。

望共勉。。

转载于:https://www.cnblogs.com/dqsBK/p/7603332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值