P1541 烏龜棋 線性動規

2022-03-14 08:02:27 字數 1854 閱讀 8501

洛谷

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

烏龜棋的棋盤只有一行,該行有 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 個整數,表示小明最多能得到的分數。

資料範圍

\(1≤n≤350\)

\(1≤m≤120\)

\(0≤ai≤100\)

\(1≤bi≤4\)

每種爬行卡片的張數不會超過40。

輸入樣例:

9 5

6 10 14 2 8 8 18 5 17

1 3 1 2 1

輸出樣例:
73
看到棋子的數量最多有4種,那麼我們很容易地想到以棋子的個數為4個維度

狀態表示:\(f[b1,b2,b3,b4]\) 表示所有第 \(i\) 種卡片使用了 \(bi\) 張的走法的最大分值。

狀態計算:將 \(f[b1,b2,b3,b4]\) 表示的所有走法按最後一步選擇哪張卡片分成四類:第 \(i\)

類為最後一步選擇第 \(i\) 種卡片。比如 \(i=2\),則這一類的最大分值是

\(f[b1,b2−1,b3,b4]+score[b1+2b2+3b3+4b4+1]\)

時間複雜度

一共有 \(40^4\) 個狀態,每個狀態需要 o(1) 的計算量,因此總時間複雜度是 \(o(40^4)\)

得出:從小的資料範圍,小的狀態入手,往往對我們想出正解,或者往正解這條道上引有重要的意義

#include using namespace std;

const int m = 45;

int f[m][m][m][m];

int num[5];

int n, m;

int score[200000];

int main()

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

if (j >= 1)

if (z >= 1)

if (k >= 1)}}

} }cout << f[num[1]][num[2]][num[3]][num[4]] + score[1] << endl;

return 0;

}

P1541 烏龜棋(題解)

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

P1541 烏龜棋(四維動歸)

題目描述 烏龜棋的棋盤是一行 nn 個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第 nn 格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中 mm 張爬行卡片,分成4種不同的型別 mm 張卡片中不一定包含所有 44 種型別的卡片,見樣例 每種型別的卡片上分別標有 1...

洛谷 P1541 烏龜棋

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