poj 2385
一共有 2 棵蘋果樹,
一頭奶牛站在其中一棵蘋果樹下等待蘋果落下,
由于任意一個時刻只能站在一棵樹下,它從一棵樹移動到另外一棵樹的時間不計,
一頭奶牛站在其中一棵蘋果樹下等待蘋果落下,
由于任意一個時刻只能站在一棵樹下,它從一棵樹移動到另外一棵樹的時間不計,
奶牛不愿意太頻繁移動,現在給定蘋果的下落次序和最大移動次數,問奶牛最多可以抓住幾個蘋果。
/*16ms,388KB*/#include<cstdio> #include<algorithm> using namespace std;int dp[31];///dp[i]表示進行了i次移動后接到(吃掉)的蘋果數的最大值 ///偶數為第一棵樹,奇數為第二棵樹 ///所以開一個一維數組就行int main() {int i, n, w, tree;scanf("%d%d", &n, &w);while (n--){scanf("%d", &tree);if (tree == 1){for (i = 2; i <= w; i += 2)///第一棵樹dp[i] = max(dp[i], dp[i - 1]) + 1;///要么不換位置,要么換位置++dp[0];///不進行任何移動時所能接到的蘋果數}else{for (i = 1; i <= w; i += 2)///第二棵樹dp[i] = max(dp[i], dp[i - 1]) + 1;}//for (i = 0; i <= w; ++i)//printf("%d\t", dp[i]);//putchar(10);//putchar(10);}printf("%d\n", max(dp[w - 1], dp[w]));return 0; } 給出t與w
接著t行給出1,2分別代表那分鐘是那棵樹掉落了蘋果
解題思路:每次奶牛只有兩種決策,在某一分鐘的時候轉移或者不轉移,我們只要知道前面分鐘兩者之間的最大值,繼而可以得到當前狀態的最大值
動態規劃設dp[T][W]代表第T分鐘的時候移動W次的所得到的最大蘋果數
那么狀態轉移方程為:
dp[T][W] = max(dp[T-1][W] + (a[T]==W%2+1),dp[T-1][W-1]+(a[T]==W%2+1))
a[T]==W%2+1,是看當前轉移了W次后在哪棵樹下,當前能不能得到這個蘋果
總結
- 上一篇: poj 2392 dp 不是很懂哎!!!
- 下一篇: hdu 2602 01背包入门