日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]

發(fā)布時(shí)間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划训练14 [Max Sum Plus Plus HDU - 1024 ] 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Max Sum Plus Plus

? HDU - 1024?


題意大致是說(shuō)給你你個(gè)序列,把它劃分成不相交的幾個(gè)連續(xù)的部分,然后把這個(gè)幾個(gè)部分求和,求出和的最大值。

我們定義子結(jié)構(gòu) ?dp[i][j] ?表示的是從前j個(gè)元素,劃分成i段所得的最大和。

則我們可以得到轉(zhuǎn)移方程。

考慮最后一個(gè)元素

(1)當(dāng)最后一個(gè)元素自成一組

dp[i][j] 由 max{ dp[i-1][k] + a[i] } 轉(zhuǎn)移而來(lái)

(2)當(dāng)最后一個(gè)元素與前一個(gè)元素連起來(lái)成一組

dp[i][j] 由 dp[i][j-1] + a[i]轉(zhuǎn)移而來(lái)


但這樣的話(huà),空間復(fù)雜度為O(n2),顯然是不夠的,因此要用滾動(dòng)數(shù)組來(lái)優(yōu)化

時(shí)間復(fù)雜度為O(n3)也是不夠的,也需要優(yōu)化,其實(shí)轉(zhuǎn)移方程(1)里的最大值可以用一個(gè)數(shù)組維護(hù)起來(lái)

#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); } }

總結(jié)

以上是生活随笔為你收集整理的动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。