ACM題解 動態規劃專題 G天上掉餡餅

2021-10-20 02:17:51 字數 1500 閱讀 8677

都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接。由於gameboy平時老呆在房間裡玩遊戲,雖然在遊戲中是個身手敏捷的高手,但在現實中運動神經特別遲鈍,每秒種只有在移動不超過一公尺的範圍內接住墜落的餡餅。現在給這條小徑如圖示上座標:input

輸入資料有多組。每組資料的第一行為以正整數n(0output

sample input

6

5 14 1

6 17 2

7 28 3

0

sample output

4
0-11個點上掉餡餅,每秒鐘每個點掉的餡餅個數不定,每秒只能接住乙個點上的餡餅,下一秒接餡餅的位置在當前位置左邊乙個點,當前位置,當前位置右邊乙個點;初始位置在5,求最終接到最多的餡餅個數有多少。

可以發現這是乙個變形的數塔題,而且不是貪心,因為即使這一秒選擇了最多的餡餅的位置,但由於制約的下一次的位置,有可能錯過更多的餡餅,因此應該倒著往前推,這樣判斷最後乙個獲得最多的餡餅就是最後一秒的餡餅個數,倒數第二個最大餡餅就基於最後一秒前中後三個位置加對應位置上倒數第二秒的餡餅個數求最大值,依次遞推到第一秒,最終5號位置上最大的是多少就是答案。

因此首先先將輸入整理遍歷,將每一秒的各個位置上掉落的餡餅都記錄在乙個二維陣列裡,然後dp[j][i]記錄j位置從後往前推到第i+1秒時(包括第i+1秒的餡餅,不包括第i秒的)可以接到的最多的餡餅,dp的狀態更新方程為dp[j][i]=maxx(dp[j-1][i+1],dp[j][i+1],dp[j+1][i+1]);當然要注意在首尾各自沒有左邊和右邊的點要分開討論。

最終輸出dp[5][0],存放最初在該位置上接餡餅最終得到最多餡餅的個數,(不是dp[5][1],因為dp[5][1]還沒加上第一秒掉落的餡餅)。

#include#include#includeusing namespace std;

int dp[12][100002]=;

int maxx(int x,int y,int z)

else if(x=y)

return z;

else

return y;

}}int maxx(int x,int y)

int main()

}printf("%d\n",dp[5][0]);

}return 0;

}

動態規劃 天上掉餡餅

時間限制 1 sec 記憶體限制 64 mb 提交 32 解決 22 提交 狀態 討論版 命題人 題目描述 眾學生一臉不信 老師你不是又在騙我吧,天上怎麼會掉餡餅呢?墨老師滿頭大汗 我這次說得絕對是真的,其實只要你們信,天上也是會掉餡餅的。如圖所示,假設在接下來的一段時間裡,所有的餡餅都掉落在0 1...

問題 r 動態規劃 天上掉餡餅

題目描述 墨老師 大家真的很辛苦,我會送給大家乙個獎勵的 眾學生一臉不信 老師你不是又在騙我吧,天上怎麼會掉餡餅呢?墨老師滿頭大汗 我這次說得絕對是真的,其實只要你們信,天上也是會掉餡餅的。如圖所示,假設在接下來的一段時間裡,所有的餡餅都掉落在0 10這11個位置。玩家每秒鐘只能在移動不超過一公尺的...

杭電ACM 天上掉餡餅(DP)

注意點 time 1 活動範圍為4 6 time 2 3 7 time 3 2 8 time 4 1 9 time 5 0 10 全範圍 突破口 狀態 dp i,j 在i秒,j位置能獲得的最大餅數 狀態轉移方程 dp i,j max dp i 1,j dp i 1,j 1 dp i 1,j 1 此題...