【问题描述】
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1 格是唯一
的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。

乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型
的卡片,见样例),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡
片后,乌龟棋子将向前爬行相应的格子数。

游戏中,玩家每次需要从所有的爬行卡片中选择
一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。
游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的

爬行中每到达一个格子,就得到
该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的
分数总和。
很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡
片使用顺序使得最终游戏得分最多。
现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到
多少分吗?

 

【解题报告】

四维DP,因为走的距离可以用用的卡片表示。(第一次做用的5维,没注意可以用卡片表示距离,NND)

 1 program tortoise;
2 var
3 f:array[0..41,0..41,0..41,0..41]of longint;
4 t:array[1..4]of integer;
5 a:array[0..351]of longint;
6 n,m,x,x1,x2,x3,x4,i:integer;
7 maxn:longint;
8
9 procedure init;
10 begin
11 assign(input,'tortoise.in');
12 reset(input);
13 assign(output,'tortoise.out');
14 rewrite(output);
15 end;
16
17 procedure outit;
18 begin
19 close(input);
20 close(output);
21 end;
22
23 function max(a,b:longint):longint;
24 begin
25 if a>b then exit(a);
26 exit(b);
27 end;
28
29 procedure main;
30 begin
31 readln(n,m);
32 fillchar(t,sizeof(t),0);
33 fillchar(f,sizeof(f),0);
34 for i:=1 to n do read(a[i]);
35 for i:=1 to m do
36 begin
37 read(x);
38 inc(t[x]);
39 end;
40 for x1:=0 to t[1] do
41 for x2:=0 to t[2] do
42 for x3:=0 to t[3] do
43 for x4:=0 to t[4] do
44 begin
45 maxn:=0;
46 if x1>0 then maxn:=max(maxn,f[x1-1,x2,x3,x4]);
47 if x2>0 then maxn:=max(maxn,f[x1,x2-1,x3,x4]);
48 if x3>0 then maxn:=max(maxn,f[x1,x2,x3-1,x4]);
49 if x4>0 then maxn:=max(maxn,f[x1,x2,x3,x4-1]);
50 f[x1,x2,x3,x4]:=maxn+a[x1+2*x2+3*x3+4*x4+1];
51 end;
52 writeln(f[t[1],t[2],t[3],t[4]]);
53 end;
54
55 begin
56 init;
57 main;
58 outit;
59 end.
60
61