hdu 1024

d[i][j]表示前i个分成j段的含a[i]的最大值。1,2,-3.中a[3][1]=0。因为a[3][1]必须包括a[3].
这样表示后,d[i][m]就表示前i个分成m段的含a[i]的最大值。那么只要从i=1到i=n,求d[i][m]的最大值,就是前n个分成m段的最大值。
比如说:
样例
1,4
1,2,-2,4
d[1][1]=1,d[2][1]=3,d[3][1]=1,d[4][1]=5.max=5,故输出5.
然后就是求状态方程了。

状态dp[i][j]
有前j个数,组成i组的和的最大值。
决策: 第j个数,是在第包含在第i组里面,还是自己独立成组。
方程 dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + a[j] ) 0<k<j
空间复杂度,m未知,n<=1000000,  继续滚动数组。
时间复杂度 n^3. n<=1000000.  显然会超时,继续优化。
max( dp[i-1][k] ) 就是上一组 0....j-1 的最大值。我们可以在每次计算dp[i][j]的时候记录下前j个
的最大值 用数组保存下来  下次计算的时候可以用,这样时间复杂度为 n^2.
View Code

 

 

posted on 2013-07-31 15:30  blieveboy  阅读(71)  评论(0编辑  收藏  举报

导航