(點選此處檢視原題)
此處有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#includeview code#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;
}
P1541 烏龜棋(題解)
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...
洛谷 P1541 烏龜棋
題目背景 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別...
洛谷P1541 烏龜棋
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...