动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]
生活随笔
收集整理的這篇文章主要介紹了
动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Max Sum Plus Plus
? HDU - 1024?
題意大致是說給你你個序列,把它劃分成不相交的幾個連續的部分,然后把這個幾個部分求和,求出和的最大值。
我們定義子結構 ?dp[i][j] ?表示的是從前j個元素,劃分成i段所得的最大和。
則我們可以得到轉移方程。
考慮最后一個元素
(1)當最后一個元素自成一組
dp[i][j] 由 max{ dp[i-1][k] + a[i] } 轉移而來
(2)當最后一個元素與前一個元素連起來成一組
dp[i][j] 由 dp[i][j-1] + a[i]轉移而來
但這樣的話,空間復雜度為O(n2),顯然是不夠的,因此要用滾動數組來優化
時間復雜度為O(n3)也是不夠的,也需要優化,其實轉移方程(1)里的最大值可以用一個數組維護起來
#include <cstdio.> #include <cstring> #include <algorithm> using namespace std; int a[1000000]; int sum[1000000]; int dp[2][1000000]; int mx[2][1000000]; main(){int m,n;while(scanf("%d%d",&m,&n) != EOF){memset(dp,0,sizeof(dp));for(int i = 0;i < n;i++){mx[0][i] = 0;mx[1][i] = -1e9;}for(int i = 0;i < n;i++){scanf("%d",&a[i]);sum[i] = i != 0 ? a[i] + sum[i-1]:a[i];}for(int i = 1;i <= m;i++){mx[i&1][i-1] = -1e9;dp[i&1][i-1] = sum[i-1];mx[i&1][i-1] = max(mx[i&1][i-1],dp[i&1][i-1]);for(int j = i;j < n;j++){dp[i&1][j] = max(dp[i&1][j-1] + a[j],mx[(i-1)&1][j-1] + a[j]);mx[i&1][j] = max(mx[i&1][j-1],dp[(i&1)][j]);}}int ans = -1e9;for(int i = m-1;i < n;i++){ans = max(ans,dp[m&1][i]);}printf("%d\n",ans); } }總結
以上是生活随笔為你收集整理的动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二郎神的狗叫什么 哮天犬简介
- 下一篇: 动态规划训练15 [Monkey and