P1541 烏龜棋(四維動歸)

2021-09-27 04:45:15 字數 1840 閱讀 8314

題目描述

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

烏龜棋中 mm 張爬行卡片,分成4種不同的型別( mm 張卡片中不一定包含所有 44 種型別的卡片,見樣例),每種型別的卡片上分別標有 1,2,3,41,2,3,4 四個數字之一,表示使用這種卡片後,烏龜棋子將向前爬行相應的格仔數。遊戲中,玩家每次需要從所有的爬行卡片中選擇一張之前沒有使用過的爬行卡片,控制烏龜棋子前進相應的格仔數,每張卡片只能使用一次。

遊戲中,烏龜棋子自動獲得起點格仔的分數,並且在後續的爬行中每到達乙個格仔,就得到該格仔相應的分數。玩家最終遊戲得分就是烏龜棋子從起點到終點過程中到過的所有格仔的分數總和。

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

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

輸入輸出格式

輸入格式

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

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

第 22 行 nn 個非負整數, a_1,a_2,…,a_na1​,a2​,…,an​ ,其中 a_iai​ 表示棋盤第 ii 個格仔上的分數。

第 33 行 mm 個整數, b_1,b_2,…,b_mb1​,b2​,…,bm​ ,表示m張爬行卡片上的數字。

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

輸出格式

11 個整數,表示小明最多能得到的分數。

輸入輸出樣例

輸入樣例#

9 56 10 14 2 8 8 18 5 17

1 3 1 2 1

輸出樣例#

說明每個測試點 1s1s

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

對於 30%30% 的資料有 1≤n≤30,1≤m≤121≤n≤30,1≤m≤12 。

對於 50%50% 的資料有 1≤n≤120,1≤m≤501≤n≤120,1≤m≤50 ,且 44 種爬行卡片,每種卡片的張數不會超過 2020 。

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

#include#include#includeusing namespace std;

const int maxn=41;

int dp[maxn][maxn][maxn][maxn],num[351],f[5],n,m,x;

//dp[a][b][c][d]:表示你出了a張爬行牌1,b張爬行牌2,c張爬行牌3,d張爬行牌4時的得分

//f[x]:表示牌x一共有多少張

int main()

for(a=0;a<=f[1];a++)

for(b=0;b<=f[2];b++)

for(c=0;c<=f[3];c++)

for(d=0;d<=f[4];d++)

cout

}

DP 四維陣列 P1541 烏龜棋

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

P1541 烏龜棋 線性動規

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

洛谷 P1541 烏龜棋 (四維費用揹包)

一開始直接用01揹包 後來發現這個物品和位置有關。也就是價值不是固定的 後來看了題解 看了卡片最多就4 所以這是乙個四維費用的揹包,每一維是卡片的數量 價值就是當前的位置的價值。但是與常規的揹包還是有點不同 中沒有列舉物品這一項 實際上迴圈裡面的四個卡片的判斷語句就是列舉四個物品 這裡是先體積後物品...