P1541 烏龜棋(動態規劃)

2022-05-15 19:19:33 字數 1632 閱讀 8188

(點選此處檢視原題)

此處有n個位置,記為1~n,每個位置上都對應乙個權值,烏龜從編號為1的位置出發,利用m張爬行卡片到達位置n,爬行卡牌有四種,分別可以讓烏龜移動1,2,3,4步,並保證將m張牌全部用盡的時候,烏龜可以到達位置n,而烏龜每到達乙個位置,就將獲取這一位置的權值,問如何安排爬行卡牌的使用順序,使得烏龜獲得的總權值最大

注意到烏龜用盡所有的爬行卡牌後將到達終點n,而且只能利用爬行卡牌從位置1開始移動,如果我們知道使用這張卡牌之前已經使用過每種卡牌多少個,那麼每次使用任意一張爬行卡牌的時候,我們就很容易地找出轉移方程,記dp[x1][x2][x3][x4]記錄用了x1張步數為1的卡,x2張步數為2的卡,x3張步數為3的卡,x4張步數為4的卡的情況下獲取的最大價值,同時也說明在位置 1 + x1 + 2 * x2 + 3 * x3 + 4 * x4 的最大價值是多少,那麼轉移方程為:

now = 1 + x1 + 2 * x2 + 3 * x3 + 4 * x4;

dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1 - 1][x2][x3][x4] + val[now]);

dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2 - 1][x3][x4] + val[now]);

dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2][x3 - 1][x4] + val[now]);

dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2][x3][x4 - 1] + val[now]);

為了列舉dp陣列的四個維度,我們先統計出四種爬行卡牌的總數,隨後列舉四個維度,得到答案

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define bug cout << "**********" << endl

#define show(x, y) cout<

using

namespace

std;

typedef

long

long

ll;const

int inf = 1e9 + 7

;const ll mod = 1e9 + 7

;const

int max = 1e6 + 10

;int

n, m;

intval[max];

int num[5

];int dp[41][41][41][41]; //

dp[x1][x2][x3][x4]記錄用了x1張步數為1的卡,x2張步數為2的卡,x3張步數為3的卡,x4張步數為4的卡

intmain()

printf(

"%d\n

", dp[num[1]][num[2]][num[3]][num[4

]]);

return0;

}

view code

P1541 烏龜棋(題解)

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...

洛谷 P1541 烏龜棋

題目背景 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別...

洛谷P1541 烏龜棋

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...