背包DP:乌龟棋
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。 烏龜棋的棋盤是一行N個格子,每個格子上一個分數(非負整數)。棋盤第1格是唯一 的起點,第N格是終點,游戲要求玩家控制一個烏龜棋子從起點出發走到終點。
…… 1 2 3 4 5 ……N 烏龜棋中M張爬行卡片,分成4種不同的類型(M張卡片中不一定包含所有4種類型 的卡片,見樣例),每種類型的卡片上分別標有1、2、3、4四個數字之一,表示使用這種卡 片后,烏龜棋子將向前爬行相應的格子數。游戲中,玩家每次需要從所有的爬行卡片中選擇 一張之前沒有使用過的爬行卡片,控制烏龜棋子前進相應的格子數,每張卡片只能使用一次。 游戲中,烏龜棋子自動獲得起點格子的分數,并且在后續的爬行中每到達一個格子,就得到 該格子相應的分數。玩家最終游戲得分就是烏龜棋子從起點到終點過程中到過的所有格子的 分數總和。 很明顯,用不同的爬行卡片使用順序會使得最終游戲的得分不同,小明想要找到一種卡 片使用順序使得最終游戲得分最多。 現在,告訴你棋盤上每個格子的分數和所有的爬行卡片,你能告訴小明,他最多能得到 多少分嗎?
輸入描述?Input Description輸入的每行中兩個數之間用一個空格隔開。 第1行2個正整數N和M,分別表示棋盤格子數和爬行卡片數。 第2行N個非負整數,a1a2……aN
,其中ai表示棋盤第i個格子上的分數。 第3行M個整數,b1b2……bM
,表示M張爬行卡片上的數字。 輸入數據保證到達終點時剛好用光M張爬行卡片,即N - 1=∑(1->M) bi
輸出描述?Output Description輸出一行一個整數
樣例輸入?Sample Input13?8
4?96?10?64?55?13?94?53?5?24?89?8?30
1?1?1?1?1?2?4?1
樣例輸出?Sample Output455
數據范圍及提示? Data Size & Hint 【數據范圍】 對于30%的數據有1?≤?N≤?30,1?≤M≤?12。 對于50%的數據有1?≤?N≤?120,1?≤M≤?50,且4?種爬行卡片,每種卡片的張數不會超 過20。 對于100%的數據有1?≤?N≤?350,1?≤M≤?120,且4?種爬行卡片,每種卡片的張數不會 超過40;0?≤?ai?≤?100,1?≤?i?≤?N;1?≤?bi?≤?4,1?≤?i?≤M。輸入數據保證N?1=ΣM i?b1假設剩余t1張1,t2張2,t3張3,t4張4,最大得分為f[t1,t2,t3,t4]
那么向前推,上一會可能取走的是1,2,3,4,最大值在里面
var a,b:array[1..350] of longint;
f:array[0..40,0..40,0..40,0..40] of longint;
n,i,j,k,m,t1,t2,t3,t4,i1,i2,i3,i4:longint;
begin
readln(n,m);
for i:=1 to n do
read(a[i]); //每一點權值
for j:=1 to m do
begin
read(b[j]); //每一種牌數
if b[j]=1 then inc(t1);
if b[j]=2 then inc(t2);
if b[j]=3 then inc(t3);
if b[j]=4 then inc(t4);
end;
f[0,0,0,0]:=a[1];
for i1:=0 to t1 do
for i2:=0 to t2 do
for i3:=0 to t3 do
for i4:=0 to t4 do
begin
if (i1>0)and(f[i1-1,i2,i3,i4]+a[i1*1+i2*2+i3*3+i4*4+1]>f[i1,i2,i3,i4])
then f[i1,i2,i3,i4]:=f[i1-1,i2,i3,i4]+a[i1*1+i2*2+i3*3+i4*4+1];
if (i2>0)and(f[i1,i2-1,i3,i4]+a[i1*1+i2*2+i3*3+i4*4+1]>f[i1,i2,i3,i4])
then f[i1,i2,i3,i4]:=f[i1,i2-1,i3,i4]+a[i1*1+i2*2+i3*3+i4*4+1];
if (i3>0)and(f[i1,i2,i3-1,i4]+a[i1*1+i2*2+i3*3+i4*4+1]>f[i1,i2,i3,i4])
then f[i1,i2,i3,i4]:=f[i1,i2,i3-1,i4]+a[i1*1+i2*2+i3*3+i4*4+1];
if (i4>0)and(f[i1,i2,i3,i4-1]+a[i1*1+i2*2+i3*3+i4*4+1]>f[i1,i2,i3,i4])
then f[i1,i2,i3,i4]:=f[i1,i2,i3,i4-1]+a[i1*1+i2*2+i3*3+i4*4+1];
end;
writeln(f[t1,t2,t3,t4]);
end.
轉載于:https://www.cnblogs.com/spiderKK/p/4301630.html
總結
- 上一篇: WP8.1 Study18:动态磁贴
- 下一篇: sharepoint2010 创建自定义