POJ 2228 Naptime(DP 環形處理)

2022-05-19 20:48:10 字數 1098 閱讀 2207

這題一眼望去dp。

發現自己太智障了。

這題想的是o(n^3m)的。

環形處理只會斷環成鏈。。。。然後dp也想的不好。

我們先考慮如果除去環這題該怎麼做?

dp[i][j][0/1]代表到第i小時睡了j個小時,第i小時睡了/沒睡權值最大值。

初值dp[1][1][1]=dp[1][0][0]=0;dp[i][0][0]=0;其餘都是負無窮。

轉移dp[i][j][1]=max(dp[i-1][j-1][0],do[i-1[j-1][2]+w[i]);

dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j[1]);

目標dp[n][m][1].dp[n][m][0];

然後考慮環,我們發現我們少考慮的只是第乙個小時和上一天最後乙個小時都睡覺的情況。

我們保證第乙個小時和上一天最後乙個小時都睡覺再做一次dp。

初值dp[1][1][1]=a[1];dp[i][0][0]=0;其餘都是負無窮。

轉一樣目標

dp[n][m][1]];

這樣我們做兩次dp,就處理了環的情況。

注意這題空間比較少,滾一下就好了

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int n=4000;8

const

int inf=199999999;9

int n,m,a[n],dp[2][n][2

],ans;

10int

main()20}

21 ans=max(dp[n&1][m][0],dp[n&1][m][1

]);22 memset(dp,-63,sizeof(dp));dp[1][1][1]=a[1

];23

for(int i=2;i<=n;i++)29}

30 printf("

%d",max(ans,dp[n&1][m][1

]));

31return0;

32 }

poj2228 Naptime 題解報告

題目傳送門 題目大意 一天由 n 個小時構成,在第 i 個小時睡覺能夠恢復 u i 點體力。有一頭牛要休息 b 個小時,可以不連續,但休息的第1個小時無法恢復體力。前一天的最後乙個小時和第二天的第乙個小時是連在一起的,求這頭牛能恢復的體力最大值。思路解析 首先這是乙個環形dp問題,所以我們先簡化問題...

poj 3517 約瑟夫環。。。。。

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...

poj 2244 約瑟夫環

這裡在推一遍公式 由於每次都是由1開始,所以可以把1排除掉,直接將城市數變成k 1,把2當作1.k 1 1 n n k n 1 就是原來的1 n k 1 k n 2 n 1 本輪x 下一輪x 但是本輪只剩下n 1個數了,而編號還是從1 n 中間缺少了ans i 1 中斷了,而下一輪是連續的 所以重新...