NOJ1060 接蘋果 二維DP

2021-06-28 05:24:25 字數 1674 閱讀 3848

題目描述

很少有人知道奶牛愛吃蘋果。農夫約翰的農場上有兩棵蘋果樹(編號為1和2), 每一棵樹上都長滿了蘋果。奶牛貝茜無法摘下樹上的蘋果,所以她只能等待蘋果 從樹上落下。但是,由於蘋果掉到地上會摔爛,貝茜必須在半空中接住蘋果(沒有人愛吃摔爛的蘋果)。貝茜吃東西很快,她接到蘋果後僅用幾秒鐘就能吃完。每一分鐘,兩棵蘋果樹其中的一棵會掉落乙個蘋果。貝茜已經過了足夠的訓練, 只要站在樹下就一定能接住這棵樹上掉落的蘋果。同時,貝茜能夠在兩棵樹之間 快速移動(移動時間遠少於1分鐘),因此當蘋果掉落時,她必定站在兩棵樹其中的一棵下面。此外,奶牛不願意不停地往返於兩棵樹之間,因此會錯過一些蘋果。蘋果每分鐘掉落乙個,共t(1<=t<=1000)分鐘,貝茜最多願意移動w(1<=w<=30) 次。現給出每分鐘掉落蘋果的樹的編號,要求判定貝茜能夠接住的最多蘋果數。 開始時貝茜在1號樹下。 輸入

第一行2個數,t和k。接下來的t行,每行乙個數,代表在時刻t蘋果是從1號蘋果樹還是從2號蘋果樹上掉下來的。 輸出

對於每個測試點,輸出一行,乙個數,為奶牛最多接到的蘋果的數量。

輸入樣例

7 221

1221

1 輸出樣例

6(輸出註解:貝茜不移動直到接到從第1棵樹上掉落的兩個蘋果,然後移動到第2棵樹下,直到接到從第2棵樹上掉落的兩個蘋果,最後移動到第1棵樹下,接住最後兩個從第1 棵樹上掉落的蘋果。這樣貝茜共接住6個蘋果。)

解題思路

這是一題二維dp  我們用dp[i][j]表示到前i個蘋果,換了j次的最大蘋果數量。

假設我們現在已經考慮完了i-1的情況。

那麼如果第i個蘋果我們移動:有dp[i][j] = dp[i-1][j-1] + 當前位置是否有蘋果(0或1)

如果第i個蘋果我們不移動:有dp[i][j] = dp[i-1][j] + 當前位置是否有蘋果(0or1)

(當前位置:換了j次 如果j是奇數  那麼奶牛肯定在2號樹   如果j是偶數 那麼奶牛肯定是在1號樹)

下面我們考慮一下dp的初始化。做了幾道dp問題之後我發現dp問題最難的地方在建立dp陣列 而最需要小心的地方則是dp陣列的初始化,這題就跳進了乙個陷阱。。。幸好及時發現了。

從狀態轉移方程我們知道要初始化dp[x][0]和dp[1][x]

dp[x][0] 即不移動 一直在1號樹下面 能接到多少自己腦補。。。

dp[1][x]即只考慮第乙個蘋果 奶牛在下面移來移去。。。自己腦補

下面放**

#include #include #include const int maxpingguo= 1010;

const int maxyidong = 35;

using namespace std;

int dp[maxpingguo][maxyidong];

int main()

//dp初始化

for(int i = 1 ; i <= yidong ; i ++) else

}for(int i = 1 ; i <= pingguo ; i ++)

//dp

for(int j = 1 ; j <= yidong ; j ++) else }}

int _max = -1;

for(int i = 0 ; i <= yidong ; i ++)

printf("%d\n",_max);

return 0;

}

NOJ1060 接蘋果 二維DP

題目描述 很少有人知道奶牛愛吃蘋果。農夫約翰的農場上有兩棵蘋果樹 編號為1和2 每一棵樹上都長滿了蘋果。奶牛貝茜無法摘下樹上的蘋果,所以她只能等待蘋果 從樹上落下。但是,由於蘋果掉到地上會摔爛,貝茜必須在半空中接住蘋果 沒有人愛吃摔爛的蘋果 貝茜吃東西很快,她接到蘋果後僅用幾秒鐘就能吃完。每一分鐘,...

平面二維DP

馬攔過河卒 原題傳送門 這一到題目也是比較基礎的動態規劃,也可以理解為是遞推,主要是運用加法原理,思維難度不大。我們要求從 0,0 到 n,n 的方案總數,如果沒有馬的話,我們可以這麼做 設 f i j 為從 0,0 走到 i,j 的方案總數,我們知道一定是有上面和左邊走來,所以只需要累加上面和左邊...

完美序列(二維dp)

題目描述 已知乙個長度為l的序列 b1,b2,b3,bl 1 b1 b2 b3 bl n 若這個序列滿足每個元素是它後續元素的因子,換句話說就是對於任意的i 2 i l 都滿足bi bi 1 0 其中 代表求餘 則稱這個序列是完美的。你的任務是對於給定的n和l,計算出一共有多少序列是完美序列。由於答...