Problem D 烏龜棋 四維dp

2022-03-22 20:47:37 字數 1773 閱讀 8404

time limit: 1 sec  memory limit: 128 mb

submit: 24  solved: 15

[submit][status][web board]

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。 烏龜棋的棋盤是一行 n 個格仔,每個格仔上乙個分數(非負整數)。棋盤第 1 格是唯一 的起點,第 n 格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。

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

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

一共有四張卡片,代表所能走的不同的步數,也就是當前數的取得,有可能是在前乙個數的基礎上,走了一步/兩步/三步/四步而來,因而考慮用乙個四維的狀態陣列f[i][j][k][h]分別表示卡片的張數,dp列出所有可能的狀態即可

要注意的細節:

1)第一格是唯一的起點,所以f[0][0][0][0]=a[1],也就是一張卡片都沒有用的時候,取得的初值

2)如果用了第一張卡片,則用f[1][0][0][0]表示,有f[1][0][0][0]=f[0][0][0][0]+a[2],也就是從第一格開始,走了一格,實際上要取的數是a[2],也就是a[t+1],

其中t為卡片所規定的步數

3)每張卡片只能用一次,但每一種卡片不只一張,因此在輸入的時候,需要做個統計

4)注意動規的初值,迴圈要從0開始,表示沒有用到相應的卡片

*/#include

#define n 360

#define m 42

using

namespace

std;

int n,m,x,a[n],b[5

];

intf[m][m][m][m];

intmain()

f[0][0][0][0]=a[1

];

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

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

for(int k=0;k<=b[3];k++)

for(int h=0;h<=b[4];h++)

cout

<1]][b[2]][b[3]][b[4]]<

return

0;

} view code

NOIP2010 烏龜棋 四維dp

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

luogu1541 烏龜棋 四維dp

我們發現四種卡牌每種的張數不超過40,所以4種都可以放進狀態裡,40 4 2560000,但是再把現在走到哪一位i放進狀態裡,就炸了 我們發現每種卡牌用了幾個,a,b,c,d,現在的位置 a1 b2 c3 d4 1 轉移if a 0 f a b c d max f a b c d f a 1 b c...

DP 四維陣列 P1541 烏龜棋

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