CH5E01 乌龟棋【线性DP】
5E01 乌龟棋 0x5E「动态规划」练习
描述
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1 格是唯一
的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。
1 2 3 4 5 …… N
乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型
的卡片,见样例),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡
片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择
一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。
游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到
该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的
分数总和。
很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡
片使用顺序使得最终游戏得分最多。
现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到
多少分吗?
输入格式
输入文件的每行中两个数之间用一个空格隔开。
第1 行2 个正整数N和M,分别表示棋盘格子数和爬行卡片数。
第2 行N 个非负整数,a1,a2,……,aN,其中ai 表示棋盘第i个格子上的分数。
第3 行M 个整数,b1,b2, ……, bM,表示M张爬行卡片上的数字。
输入数据保证到达终点时刚好用光M张爬行卡片
输出格式
输出只有1 行,1 个整数,表示小明最多能得到的分数。
样例输入
输入样例1
9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1 输入样例2
13 8
4 96 10 64 55 13 94 53 5 24 89 8 30
1 1 1 1 1 2 4 1
样例输出
输出样例1
73 输出样例2
455
数据范围与约定
- 对于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。
来源
CCF NOIP2010 T2
题意:
n个格子,每个格子上有一个分数。有m个牌,每个牌上可能是从1-4的数字,表示乌龟可以走1步、2步、3步或4步。乌龟到达的位置可以得到对应的分数,问怎样使用牌使得得到的分数最大。
思路:
本来想的是用五维的数组来表示。可以把乌龟到达的位置作为“阶段”。dp[pos][i][j][x][y]用来表示,到达i,1号牌用了i张,2号用了j张,3号用了x张,4号用了y张时能得到的最大分数。但是这样不管是时间还是空间应该都会超出。经过观察我们可以发现,其实pos是可以由ijxy来推出的,因此这一维就可以舍去不用。
//#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<vector>
#include<map> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL; int n, m;
const int maxn = ;
const int maxm = ;
int cnt[], sco[maxn];
int dp[][][][]; int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
scanf("%d", &sco[i]);
}
for(int i = ; i < m; i++){
int d;
scanf("%d", &d);
cnt[d]++;
} //dp[0][0][0][0] = sco[1];
for(int i = ; i <= cnt[]; i++){
for(int j = ; j <= cnt[]; j++){
for(int x = ; x <= cnt[]; x++){
for(int y = ; y <= cnt[]; y++){
int pos = i + * j + * x + * y + ;
if(i >= ) dp[i][j][x][y] = max(dp[i - ][j][x][y], dp[i][j][x][y]);
if(j >= ) dp[i][j][x][y] = max(dp[i][j - ][x][y], dp[i][j][x][y]);
if(x >= ) dp[i][j][x][y] = max(dp[i][j][x - ][y], dp[i][j][x][y]);
if(y >= ) dp[i][j][x][y] = max(dp[i][j][x][y - ], dp[i][j][x][y]);
dp[i][j][x][y] += sco[pos];
}
}
}
} printf("%d\n", dp[cnt[]][cnt[]][cnt[]][cnt[]]);
return ;
}
CH5E01 乌龟棋【线性DP】的更多相关文章
- P1541 乌龟棋 线性dp
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏要求玩家控制一个乌龟棋子 ...
- 洛谷$1541$ 乌龟棋 线性$DP$
Luogu CH Sol f[i]表示走到第i个格子时获得的最大分数 发现转移与各个爬行卡片的数量有关,一共只有4种卡片 所以就把这四种卡片的已使用张数也放进状态,f[i][a][b][c][d] ...
- 洛谷P1541 乌龟棋(四维DP)
To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...
- P1541 乌龟棋(DP)
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NNN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NNN格是终点,游戏要求玩家控制一个乌龟 ...
- codevs1068乌龟棋-四维DP,五维如何缩减一维
我们从起点x开始暴力枚举所有决策 于是可以得到如下转移 void dfs(int x,int A,int B,int C,int D,int y) { if (x==n) {ans=max(ans,y ...
- Luogu P1541 乌龟棋 【线性dp】
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行 N 个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟 ...
- NOIP2010乌龟棋[DP 多维状态]
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- 【洛谷】P1541 乌龟棋(四维背包dp)
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- Problem D: 乌龟棋【四维dp】
Problem D: 乌龟棋 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 24 Solved: 15[Submit][Status][Web Boa ...
随机推荐
- Web Socket rfc6455 握手 (C++)
std::string data((const char*)buf->data(),bytes_transferred); recycle_buffer(buf); std::string ke ...
- Atitit.软件仪表盘(2)--vm子系统--资源占用监测
Atitit.软件仪表盘(2)--vm子系统--资源占用监测 1. Jvisualvm.exe 2. jprofile 3. Heap //permgen monitor 作者::老哇的爪子At ...
- Windows下ADB默认的5037port被占用,解决方式。
Windows下可能会因为系统版本号不一样的原因导致有的系统5037port被系统进程占用.导致ADB无法使用5037port,从而导致ADB不能打开.在eclipse上跑Android程序的时候显示 ...
- Android Studio运行程序,检测不到(夜神、Genymotion)模拟器
用了统一给的android studio,运行程序,检测不到模拟器(夜神). 又新建了一个系统的模拟器,运行,提示ANDROID_SDK_ROOT is undefined 在环境变量中配置之后,夜神 ...
- jquery checkbox选中
楼主写的在1.6之前是没有问题的,jquery 1.6后就要这样写了,<input type='checkbox' id='cb'/> <script> //获取是否选中 va ...
- ajax——实现三级联动下拉列表
数据库: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- DRBD(Distributed Replicated Block Device) 分布式块设备复制 进行集群高可用方案
DRBD是一个用软件实现的.无共享的.服务器之间镜像块设备内容的存储复制解决方案. 外文名 DRBD drbdadm 高级管理工具 drbdsetup 置装载进kernel的DRBD模块 drbdme ...
- python的post请求抓取数据
python通过get方式,post方式发送http请求和接收http响应-urllib urllib2 python通过get方式,post方式发送http请求和接收http响应-- import ...
- easyui datagrid 列拖动
实现代码-code <script type="text/javascript"> $.extend($.fn.datagrid.methods, { columnMo ...
- 从此sudo不再输密码
#sudo visudo 最后一次输入密码. 在最后一行加入: xxx ALL=NOPASSWD: ALL xxx即为你当前使用的用户名,Ctrl+X,保存退出. 从此告别每次都要输密码的时代.