小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。
烏龜棋的棋盤是一行 n個格仔,每個格仔上乙個分數(非負整數)。棋盤第1格是唯一的起點,第 n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。
烏龜棋中 m張爬行卡片,分成4種不同的型別( m張卡片中不一定包含所有 4種型別的卡片,見樣例),每種型別的卡片上分別標有 1,2,3,4個數字之一,表示使用這種卡片後,烏龜棋子將向前爬行相應的格仔數。遊戲中,玩家每次需要從所有的爬行卡片中選擇一張之前沒有使用過的爬行卡片,控制烏龜棋子前進相應的格仔數,每張卡片只能使用一次。
遊戲中,烏龜棋子自動獲得起點格仔的分數,並且在後續的爬行中每到達乙個格仔,就得到該格仔相應的分數。玩家最終遊戲得分就是烏龜棋子從起點到終點過程中到過的所有格仔的分數總和。
很明顯,用不同的爬行卡片使用順序會使得最終遊戲的得分不同,小明想要找到一種卡片使用順序使得最終遊戲得分最多。
現在,告訴你棋盤上每個格仔的分數和所有的爬行卡片,你能告訴小明,他最多能得到多少分嗎?
輸入格式:
每行中兩個數之間用乙個空格隔開。
第 1行 2個正整數 n,m,分別表示棋盤格仔數和爬行卡片數。
第 2行 n個非負整數, a_1,a_2,…,a_n,其中 a_i表示棋盤第 i個格仔上的分數。
第 3行 m個整數, b_1,b_2,…,b_mb表示m張爬行卡片上的數字。
輸入資料保證到達終點時剛好用光 m 張爬行卡片。
輸出格式:
1個整數,表示小明最多能得到的分數。
輸入樣例#1:
9 5輸出樣例#1:6 10 14 2 8 8 18 5 17
1 3 1 2 1
73在講序列dp的時候講到了這道題...一看最開始竟然想到了向量(什麼?)
lyd(林永迪)說一般做在序列上的dp都以下標為階段劃分,然後就說了這題。
結果我就傻乎乎地設計為f[i]為到達i所得到的最大價值233.
轉念讓我們再想想,真的是這樣嘛?那出牌的順序怎麼搞??
然而...正解是把出牌當做階段劃分orz。
設f[a][b][i][j]為第一張牌出了a個,第二張牌出了b個,第三張牌出了i個,第四張牌出了j個的最大價值。那麼我們還可以確定當前點所在序列上的位置--a+2*b+3*i+4*j
真的是這樣嘛?
再一次被lyd騙了...
我們是從1出發的,所以真位置為a+2*b+3*i+4*j+1啊!
轉移就很好想了。可以由4個牌分別轉移過來,但是注意re問題,因為選牌的個數可以為0,所以在進行減一轉移時,要判斷是否滿足下標不會變為負數。
初值嘛,只設f[0][0][0][0]==seq[1]就好了。
轉移還有乙個細節,每次轉移都要帶著當前點的權值,而不是最後再加。因為不加當前點的時候可能比不過曾經,轉移也就沒有效果。
因為資料保證所有牌都用完,所以我們的目標狀態就是都裝滿時的狀態。
code
1 #include2 #include3view code4using
namespace
std;56
intn,m,x;
7int
a,b,c,d,ans;
8int seq[400];9
int f[41][41][41][41
]; 10
11int
main()
1223 f[0][0][0][0]=seq[1
];24
for(int i=0;i<=a;i++)
25for(int j=0;j<=b;j++)
26for(int l=0;l<=c;l++)
27for(int r=0;r<=d;r++)
2835 printf("%d"
,f[a][b][c][d]);
36return0;
37 }
P1541 烏龜棋 線性動規
洛谷 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤只有一行,該行有 n 個格仔,每個格仔上乙個分數 非負整數 棋盤第 1 格是唯一的起點,第 n 格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中共有 m 張爬行卡片,分成 4 種不同的型別 m 張卡片中不一定包含所有...
烏龜棋 洛谷1541
烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分別標有1 2 3 4四個數字之一,表示使用這種卡...
洛谷 1541 烏龜棋
n個格仔中有一些分數,到達乙個格仔就可以拿到。初始在1,n為終點 有m張牌,保證用完剛好到達終點。牌有向前移動1,2,3,4格四種,求最高分數dp j1 j2 j3 j4 表示用j1張 1 牌,j2張 2 牌,j3張 3 牌,j4張 4 牌能達到的最高分數判斷j1 0要用if j1 不是if j1 ...