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 ] ),如果考虑代码实现,因为题目中的数据量比较大,所以在实现的时候需要进一步优化,代码稍长,就不在这里粘贴了。

望共勉。。

posted @ 2017-09-27 18:43  砂糖橘子君  阅读(152)  评论(0编辑  收藏  举报