NOIP2010乌龟棋
2014-03-14 16:55
246 查看
题目描述
描述 Description
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1 格是唯一
的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。
1 2 3 4 5 …… N
乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型
的卡片,见样例),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡
片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择
一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。
游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到
该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的
分数总和。
很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡
片使用顺序使得最终游戏得分最多。
现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到
多少分吗?
输入格式 InputFormat
输入文件的每行中两个数之间用一个空格隔开。
第1 行2 个正整数N和M,分别表示棋盘格子数和爬行卡片数。
第2 行N 个非负整数,a1,a2,……,aN,其中ai 表示棋盘第i个格子上的分数。
第3 行M 个整数,b1,b2, ……, bM,表示M张爬行卡片上的数字。
输入数据保证到达终点时刚好用光M张爬行卡片
输出格式 OutputFormat
输出只有1 行,1 个整数,表示小明最多能得到的分数。
解题报告
题目本身难度不大,用一个四维背包即可解决。
状态转移方程为f[a][b][c][d]=max{f[a-1,b,c,d],f[a,b-1,c,d],f[a,b,c-1,d],f[a,b,c,d-1]}+box[a+2b+3c+4d+1].
也不过多赘述了。
上次遇见这道题目,是在2010年高一时NOIP联赛上。
如今已经三年了,长郡的OIer,我的朋友们,你们在哪呢......
代码
描述 Description
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1 格是唯一
的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。
1 2 3 4 5 …… N
乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型
的卡片,见样例),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡
片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择
一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。
游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到
该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的
分数总和。
很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡
片使用顺序使得最终游戏得分最多。
现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到
多少分吗?
输入格式 InputFormat
输入文件的每行中两个数之间用一个空格隔开。
第1 行2 个正整数N和M,分别表示棋盘格子数和爬行卡片数。
第2 行N 个非负整数,a1,a2,……,aN,其中ai 表示棋盘第i个格子上的分数。
第3 行M 个整数,b1,b2, ……, bM,表示M张爬行卡片上的数字。
输入数据保证到达终点时刚好用光M张爬行卡片
输出格式 OutputFormat
输出只有1 行,1 个整数,表示小明最多能得到的分数。
解题报告
题目本身难度不大,用一个四维背包即可解决。
状态转移方程为f[a][b][c][d]=max{f[a-1,b,c,d],f[a,b-1,c,d],f[a,b,c-1,d],f[a,b,c,d-1]}+box[a+2b+3c+4d+1].
也不过多赘述了。
上次遇见这道题目,是在2010年高一时NOIP联赛上。
如今已经三年了,长郡的OIer,我的朋友们,你们在哪呢......
代码
#include <iostream> #include <stdio.h> #include <string> #include <cstring> using namespace std; int dp[45][45][45][45]; int box[400]; int card[5]; int zero(int a) { if(a<0) return 0; else return a; } int max(int a,int b,int c,int d) { int q[5]; q[1]=a;q[2]=b;q[3]=c;q[4]=d; int maxx=-32767; for(int i=1;i<=4;i++) if(q[i]>maxx) maxx=q[i]; return maxx; } int main() { int n,m; memset(card,0,sizeof(card)); memset(dp,0,sizeof(dp)); memset(box,0,sizeof(box)); scanf("%d%d",&n,&m);//n格子数,m卡片数 for(int i=1;i<=n;i++) scanf("%d",&box[i]); int car; for(int i=1;i<=m;i++) { scanf("%d",&car); card[car]++; } dp[0][0][0][0]=0; for(int a=0;a<=card[1];a++) for(int b=0;b<=card[2];b++) for(int c=0;c<=card[3];c++) for(int d=0;d<=card[4];d++) { dp[a][b][c][d]= max(dp[zero(a-1)][b][c][d], dp[a][zero(b-1)][c][d], dp[a][b][zero(c-1)][d], dp[a][b][c][zero(d-1)])+box[a+b*2+c*3+d*4+1]; } printf("%d",dp[card[1]][card[2]][card[3]][card[4]]); return 0; }
相关文章推荐
- 【动规递推】【NOIP2010】乌龟棋 tortoise
- NOIP 提高组 2010 乌龟棋
- (1652): [NOIP2010]乌龟棋
- [NOIP2010]乌龟棋(DP)
- NOIP2010乌龟棋[DP 多维状态]
- 乌龟棋 (NOIP2010)复赛 提高组 试题二 解题代码
- 【洛谷1541】【CJOJ1087】【NOIP2010】乌龟棋
- ACM 简单DP NOIP2010提高组 乌龟棋
- 【NOIP2010提高组】乌龟棋(动态规划)
- [noip2010]乌龟棋
- noip2010 乌龟棋
- 【NOIP2010】【P1317】乌龟棋
- NOIp2010 乌龟棋
- 【dp】NOIP2010提高组乌龟棋
- NOIP2010提高组乌龟棋 -SilverN
- NOIP2010提高组复赛 解题报告(C/C++)(机械翻译)(乌龟棋)(关押罪犯)(引水入城)
- NOIP2010 机器翻译 乌龟棋 关押罪犯
- NOIP提高组2010 乌龟棋
- noip2010 乌龟棋
- 【noip2010】乌龟棋