題目描述
很少有人知道奶牛愛吃蘋果。農夫約翰的農場上有兩棵蘋果樹(編號為1和2), 每一棵樹上都長滿了蘋果。奶牛貝茜無法摘下樹上的蘋果,所以她只能等待蘋果 從樹上落下。但是,由於蘋果掉到地上會摔爛,貝茜必須在半空中接住蘋果(沒有人愛吃摔爛的蘋果)。貝茜吃東西很快,她接到蘋果後僅用幾秒鐘就能吃完。每一分鐘,兩棵蘋果樹其中的一棵會掉落乙個蘋果。貝茜已經過了足夠的訓練, 只要站在樹下就一定能接住這棵樹上掉落的蘋果。同時,貝茜能夠在兩棵樹之間 快速移動(移動時間遠少於1分鐘),因此當蘋果掉落時,她必定站在兩棵樹其中的一棵下面。此外,奶牛不願意不停地往返於兩棵樹之間,因此會錯過一些蘋果。蘋果每分鐘掉落乙個,共t(1<=t<=1000)分鐘,貝茜最多願意移動w(1<=w<=30)
次。現給出每分鐘掉落蘋果的樹的編號,要求判定貝茜能夠接住的最多蘋果數。 開始時貝茜在1號樹下。
輸入第一行2個數,t和k。接下來的t行,每行乙個數,代表在時刻t蘋果是從1號蘋果樹還是從2號蘋果樹上掉下來的。
輸出對於每個測試點,輸出一行,乙個數,為奶牛最多接到的蘋果的數量。
輸入樣例
7 2211
2211
輸出樣例
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 apple[maxpingguo][3];//apple[i][j]=1為在第i分鐘j樹上有蘋果 這樣設計apple陣列為下面的dp創造方便
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,計算出一共有多少序列是完美序列。由於答...