動態規劃 烏龜棋

2022-04-04 22:30:45 字數 1717 閱讀 5404

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。 

烏龜棋的棋盤是一行 n 個格仔,每個格仔上乙個分數(非負整數)。棋盤第 1 格是唯一的起點,第 n 格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。 

烏龜棋中 m 張爬行卡片,分成 4 種不同的型別(m 張卡片中不一定包含所有 4 種型別的卡片,見樣例),每種型別的卡片上分別標有 1、2、3、4 四個數字之一,表示使用這種卡片後,烏龜棋子將向前爬行相應的格仔數。遊戲中,玩家每次需要從所有的爬行卡片中選擇一張之前沒有使用過的爬行卡片,控制烏龜棋子前進相應的格仔數,每張卡片只能使用一次。遊戲中,烏龜棋子自動獲得起點格仔的分數,並且在後續的爬行中每到達乙個格仔,就得到該格仔相應的分數。玩家最終遊戲得分就是烏龜棋子從起點到終點過程中到過的所有格仔的分數總和。 

很明顯,用不同的爬行卡片使用順序會使得最終遊戲的得分不同,小明想要找到一種卡片使用順序使得最終遊戲得分最多。 

現在,告訴你棋盤上每個格仔的分數和所有的爬行卡片,你能告訴小明,他最多能得到多少分嗎? 

輸入每行中兩個數之間用乙個空格隔開。

第1行2個正整數n和m,分別表示棋盤格仔數和爬行卡片數。

第2行n個非負整數,a1,a2,……,an,其中ai表示棋盤第i個格仔上的分數。

第3行m個整數,b1,b2,……,bm,表示m張爬行卡片上的數字。

輸入資料保證到達終點時剛好用光m張爬行卡片,即

輸出只有1行,1個整數,表示小明最多能得到的分數。

9 5 

6 10 14 2 8 8 18 5 17

1 3 1 2 1

73

小明使用爬行卡片順序為1,1,3,1,2,得到的分數為6+10+14+8+18+17=73。注意,由於起點是1,所以自動獲得第1格的分數6。

對於100%的資料有1≤n≤350,1≤m≤120,且4種爬行卡片,每種卡片的張數不會超過40;0≤ai≤100,1≤i≤n;1≤bi≤4,1≤i≤m。

思路:想法1:用dp[i]表示到達第i格的最高分數,那麼它的值可由max+a[i]得到,問題是在執行這一步時這可能有些種類的牌已經用光了,所以這個狀態轉移方程時錯誤的。

想法2:既然這樣,我們可以想到再增加幾類狀態,用dp[i][a][b][c][d]來表示用a張『1』,b張『2』,c張『3』,d張『4』到達第i格時的最高分數,它的值同樣可以由前面已得到的值求出,問題是這樣要開350*40*40*40*40的陣列,占用記憶體太大,會mle。

想法3:我們發現,其實上述的i就等於a*1+b*2+c*3+d*4,所以第一維其實可以省去,直接用dp[a][b][c][d]來表示到達第a*1+b*2+c*3+d*4+1格(首先在第1格)時的最高分數,狀態轉移方程為max+a[a*1+b*2+c*3+d*4+1]。

ac**:

#include #include

#include

using

namespace

std;

int a[500

];int dp[45][45][45][45

];int tot[5

];int

main()

for(int i=1;i<=m;i++)

for(int i=0;i<=tot[1];i++)}}

}printf(

"%d\n

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

]]);

return0;

}

烏龜棋 動態規劃

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

P1541 烏龜棋(動態規劃)

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

luogu1541 烏龜棋 動態規劃

一行格仔,每個格仔裡有數字。一些卡片,卡片上有1 2 3 4這幾種數字。一開始你在格仔1,隨後每次選乙個卡片,你可以前進卡片上的數字個格仔,得到格仔上的分數,然後講該卡片丟棄。求取卡片的順序,使得得到的分數之和最大。定義 a 陣列為格仔上的各個數字,f p,a,b,c,d 為從位置1走到位置 p 已...