博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1541 乌龟棋
阅读量:5077 次
发布时间:2019-06-12

本文共 2616 字,大约阅读时间需要 8 分钟。

题目背景

小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。

题目描述

乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第NN格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。

乌龟棋中MM张爬行卡片,分成4种不同的类型(MM张卡片中不一定包含所有44种类型的卡片,见样例),每种类型的卡片上分别标有1,2,3,41,2,3,4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。

游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。

很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。

现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?

输入格式

每行中两个数之间用一个空格隔开。

11行22个正整数N,MN,M,分别表示棋盘格子数和爬行卡片数。

22行NN个非负整数,a_1,a_2,…,a_Na1,a2,,aN,其中a_iai表示棋盘第ii个格子上的分数。

33行MM个整数,b_1,b_2,…,b_Mb1,b2,,bM,表示M张爬行卡片上的数字。

输入数据保证到达终点时刚好用光MM张爬行卡片。

输出格式

11个整数,表示小明最多能得到的分数。

输入输出样例

输入 #1复制
9 56 10 14 2 8 8 18 5 171 3 1 2 1
输出 #1复制
73

说明/提示

每个测试点1s1s

小明使用爬行卡片顺序为1,1,3,1,21,1,3,1,2,得到的分数为6+10+14+8+18+17=736+10+14+8+18+17=73。注意,由于起点是11,所以自动获得第11格的分数66。

对于30\%30%的数据有1≤N≤30,1≤M≤121N30,1M12。

对于50\%50%的数据有1≤N≤120,1≤M≤501N120,1M50,且44种爬行卡片,每种卡片的张数不会超过2020。

对于100\%100%的数据有1≤N≤350,1≤M≤1201N350,1M120,且44种爬行卡片,每种卡片的张数不会超过4040;0≤a_i≤100,1≤i≤N,1≤b_i≤4,1≤i≤M0ai100,1iN,1bi4,1iM。

 

这个题可以说运用了背包的思想:

开的主要变量:

1.F[a][b][c][d]:表示你出了a张爬行牌1,b张爬行牌2,c张爬行牌3,d张爬行牌4时的得分

2.g[x]:表示牌x一共有多少张

 

#include
#include
using namespace std;const int MAXN=55;int n,m,i,j,f[MAXN][MAXN][MAXN][MAXN],num[351],g[5],x,a,b,c,d;inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-'){ w=-1; } ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*w;}int main(){ n=read(); m=read(); for(i=1;i<=n;i++){ num[i]=read(); } f[0][0][0][0]=num[1]; for(j=1;j<=m;j++){ x=read(); g[x]++; } for(int a=0;a<=g[1];a++){ for(int b=0;b<=g[2];b++){ for(int c=0;c<=g[3];c++){ for(int d=0;d<=g[4];d++){ int r=1+a+b*2+c*3+d*4; if(a!=0){ f[a][b][c][d]=max(f[a][b][c][d],f[a-1][b][c][d]+num[r]); } if(b!=0){ f[a][b][c][d]=max(f[a][b][c][d],f[a][b-1][c][d]+num[r]); } if(c!=0){ f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-1][d]+num[r]); } if(d!=0){ f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-1]+num[r]); } } } } } printf("%d",f[g[1]][g[2]][g[3]][g[4]]); return 0;}

 

转载于:https://www.cnblogs.com/hrj1/p/11478905.html

你可能感兴趣的文章
关于Xshell无法连接centos6.4的问题
查看>>
spring security 11种过滤器介绍
查看>>
代码实现导航栏分割线
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
关于源程序到可运行程序的过程
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
软件目录结构规范
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>