NOIP 2010 乌龟棋
题目背景
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
题目描述
乌龟棋的棋盘是一行 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 个整数,表示小明最多能得到的分数。
输入输出样例
说明
每个测试点 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≤121≤N≤30,1≤M≤12 。
对于 50\%50% 的数据有 1≤N≤120,1≤M≤501≤N≤120,1≤M≤50 ,且 44 种爬行卡片,每种卡片的张数不会超过 2020 。
对于 100\%100% 的数据有 1≤N≤350,1≤M≤1201≤N≤350,1≤M≤120 ,且 44 种爬行卡片,每种卡片的张数不会超过 4040 ;0≤a_i≤100,1≤i≤N,1≤b_i≤4,1≤i≤M0≤ai≤100,1≤i≤N,1≤bi≤4,1≤i≤M 。
思路:DP.
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 41
using namespace std;
int n,m,x;
int g[],num[];
int f[MAXN][MAXN][MAXN][MAXN];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&num[i]);
f[][][][]=num[];
for(int i=;i<=m;i++){
scanf("%d",&x);
g[x]++;
}
for(int a=;a<=g[];a++)
for(int b=;b<=g[];b++)
for(int c=;c<=g[];c++)
for(int d=;d<=g[];d++){
int r=+a+b*+c*+d*;
if(a!=) f[a][b][c][d]=max(f[a][b][c][d],f[a-][b][c][d]+num[r]);
if(b!=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b-][c][d]+num[r]);
if(c!=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-][d]+num[r]);
if(d!=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-]+num[r]);
}
cout<<f[g[]][g[]][g[]][g[]];
}
NOIP 2010 乌龟棋的更多相关文章
- NOIP提高组2010 乌龟棋
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌 ...
- 题解 【luogu P1541 NOIp提高组2010 乌龟棋】
题目链接 题解 题意: 有一些格子,每个格子有一定分数. 给你四种卡片,每次可以使用卡片来前进1或2或3或4个格子并拾取格子上的分数 每张卡片有数量限制.求最大分数. 分析 设\(dp[i]\)为第前 ...
- 1068 乌龟棋 2010年NOIP全国联赛提高组
1068 乌龟棋 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descrip ...
- 【noip 2009】 乌龟棋 记忆化搜索&动规
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- codevs1068乌龟棋
codevs1068乌龟棋 1068 乌龟棋 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamon 题目描述 Descrip ...
- NOIP 2010
tags: NOIP 并查集 动态规划 搜索 categories: 信息学竞赛 总结 机器翻译 乌龟棋 关押罪犯 引水入城 机器翻译 Solution 维护一个队列, 每次从词典中查词时将单词加入队 ...
- NOIP2010提高组乌龟棋 -SilverN
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- NOIP2010乌龟棋[DP 多维状态]
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- NOIP 2010题解
唔..NOIP2010比较简单,总体感觉不错. Problem 1: 机器翻译 水题,队列的简单应用. 读入时判断是否在内存中,可以用hash优化.如果不在内存中push进内存,放不下了pop hea ...
随机推荐
- Android SDK镜像更新网速慢的解决问题
通过更换代理解决 Android SDK 在线更新镜像服务器资源:大连东软信息学院镜像服务器地址:http://mirrors.neusoft.edu.cn 端口:80北京化工大学镜像服务器地址:IP ...
- 读取Java文件到byte数组的三种方式
package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io ...
- Vuex/Vue 练手项目 在线汇率转换器
详情请点击: https://zhuanlan.zhihu.com/p/33362758
- 阿里云ECS安装sqlserver,本地无法连接问题排查思路
1. 阿里云控制台-对应的ECS实例的安全组是否添加了响应的端口(1433)可以访问: 2. 服务器-sqlserver服务是否开启: 3. 服务器-sqlserver配置器,对应的端口是否启用,已经 ...
- Java泛型中的协变和逆变
Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛 ...
- jQuery 返回顶部效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java线程学习1
java实现多线程有三种方式:继承Thread类,重写run方法,启动使用start:实现runnable接口,重写run方法:实现callable接口,重写call方法(可以有返回值,也可以抛出异常 ...
- shell 循环 read line
cat dockerlist |while read line;do docker rmi $line ;done
- 秋招复习-C++( 一)
Linux/Unix编程部分 1.进程间通信方式:信号,信号量,消息队列,共享内存,套接字Socket 2.ipcs: Linux/Unix下的命令,可以用来查看当前系统中所使用的进程间通信方式的各种 ...
- LBE_登录Demo
目录 服务器 最小资产库创建 entity配置 实体的Python实现 创建第一个空间Space 让entity进入空间Space 客户端(unity) 生成客户端SDK 实现Client部分验证 验 ...