Luogu P1541 乌龟棋 【线性dp】
题目背景
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
题目描述
乌龟棋的棋盘是一行 N 个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。
乌龟棋中 M 张爬行卡片,分成4种不同的类型( M 张卡片中不一定包含所有 4 种类型的卡片,见样例),每种类型的卡片上分别标有 1,2,3,4个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。
游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。
很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。
现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?
输入输出格式
输入格式:
每行中两个数之间用一个空格隔开。
第 1 行 2 个正整数 N,M,分别表示棋盘格子数和爬行卡片数。
第 2 行 N 个非负整数, a_1,a_2,…,a_N,其中 a_i 表示棋盘第 i个格子上的分数。
第 3 行 M 个整数, b_1,b_2,…,b_Mb表示M张爬行卡片上的数字。
输入数据保证到达终点时刚好用光 M 张爬行卡片。
输出格式:
1 个整数,表示小明最多能得到的分数。
输入输出样例
9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1
73
在讲序列dp的时候讲到了这道题...一看最开始竟然想到了向量(什么?)
lyd(林永迪)说一般做在序列上的dp都以下标为阶段划分,然后就说了这题。
结果我就傻乎乎地设计为f[i]为到达i所得到的最大价值233.
转念让我们再想想,真的是这样嘛?那出牌的顺序怎么搞??
然而...正解是把出牌当做阶段划分Orz。
设f[a][b][i][j]为第一张牌出了a个,第二张牌出了b个,第三张牌出了i个,第四张牌出了j个的最大价值。那么我们还可以确定当前点所在序列上的位置--a+2*b+3*i+4*j
真的是这样嘛?
再一次被lyd骗了...
我们是从1出发的,所以真位置为a+2*b+3*i+4*j+1啊!
转移就很好想了。可以由4个牌分别转移过来,但是注意RE问题,因为选牌的个数可以为0,所以在进行减一转移时,要判断是否满足下标不会变为负数。
初值嘛,只设f[0][0][0][0]==seq[1]就好了。
转移还有一个细节,每次转移都要带着当前点的权值,而不是最后再加。因为不加当前点的时候可能比不过曾经,转移也就没有效果。
因为数据保证所有牌都用完,所以我们的目标状态就是都装满时的状态。
code
#include<cstdio>
#include<algorithm> using namespace std; int n,m,x;
int a,b,c,d,ans;
int seq[];
int f[][][][]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&seq[i]);
for(int i=;i<=m;i++)
{
scanf("%d",&x);
if(x==) a++;
else if(x==) b++;
else if(x==) c++;
else if(x==) d++;
}
f[][][][]=seq[];
for(int i=;i<=a;i++)
for(int j=;j<=b;j++)
for(int l=;l<=c;l++)
for(int r=;r<=d;r++)
{
int s=+i+j*+l*+r*;
if(i->=) f[i][j][l][r]=max(f[i][j][l][r],f[i-][j][l][r]+seq[s]);
if(j->=) f[i][j][l][r]=max(f[i][j][l][r],f[i][j-][l][r]+seq[s]);
if(l->=) f[i][j][l][r]=max(f[i][j][l][r],f[i][j][l-][r]+seq[s]);
if(r->=) f[i][j][l][r]=max(f[i][j][l][r],f[i][j][l][r-]+seq[s]);
}
printf("%d",f[a][b][c][d]);
return ;
}
Luogu P1541 乌龟棋 【线性dp】的更多相关文章
- P1541 乌龟棋 线性dp
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏要求玩家控制一个乌龟棋子 ...
- Luogu P1541 乌龟棋(NOIP2010TG)
自己的第一篇博文 祭一下祭一下 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点, ...
- LuoGu P1541 乌龟棋
题目传送门 乌龟棋我并不知道他为啥是个绿题0.0 总之感觉思维含量确实不太高(虽然我弱DP)(毛多弱火,体大弱门,肥胖弱菊,骑士弱梯,入侵弱智,沙华弱Dp) 总之,设计出来状态这题就很简单了 设 f[ ...
- 洛谷P1541 乌龟棋(四维DP)
To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...
- 【题解】 Luogu P1541 乌龟棋总结 (动态规划)
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- P1541 乌龟棋(DP)
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NNN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NNN格是终点,游戏要求玩家控制一个乌龟 ...
- [NOIp2010] luogu P1541 乌龟棋
英语老师讲 mind map,真想说一句"声微饭否".为什么wyy的歌词总是快一点点.在报csp. 题目描述 你在一个序列上向正方向行走,起点是 a[0]a[0]a[0].每一步可 ...
- 洛谷$1541$ 乌龟棋 线性$DP$
Luogu CH Sol f[i]表示走到第i个格子时获得的最大分数 发现转移与各个爬行卡片的数量有关,一共只有4种卡片 所以就把这四种卡片的已使用张数也放进状态,f[i][a][b][c][d] ...
- 【洛谷】P1541 乌龟棋(四维背包dp)
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
随机推荐
- The Bottom of a Graph
poj——The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K ...
- androidstudio Cannot resolve symbol 'xxx'
Android Studio 无法识别同一个 package 里的其他类,将其显示为红色,但是 compile 没有问题.鼠标放上去后显示 “Cannot resolve symbol XXX”,重启 ...
- eclipse提速03 - 禁用动画
- 【转载】epoll与select/poll的区别总结
因为这道题目经常被问到.干脆总结一下,免得遗漏了. 参考文章:http://www.cnblogs.com/qiaoconglovelife/p/5735936.html 1 本质上都是同步I/O 三 ...
- js:简单的拖动效果
效果演示:https://jsfiddle.net/dwqs/b5ywws9f/embedded/result/ html: <div class="wrap"> &l ...
- 基于RTP的h.264视频传输系统设计(一)
一.H.264 的层次介绍 H.264 定义三个层次,每一个层次支持一组特定的编码功能.而且按照各个层次指定所指定的功能.基础层次(baselineprofile)支持I 帧和 P 帧[1]的帧内和帧 ...
- kill mediaserver脚本
#!/bin/bash adb shell kill $(adb shell ps | grep mediaserver | awk '{print $2}') adb shell pm clear ...
- 【Mongodb教程 第一课补加课2 】MongoDB下,启动服务时,出现“服务没有响应控制功能”解决方法
如图,如果通过下列代码,添加服务后,使用net start命令出现这样的问题时,可以参考下我的解决方法. D:\MongoDB>mongod --dbpath D:\MongoDB\Data - ...
- sqlserver中All、Any和Some用法与区别
转自:http://blog.csdn.net/gyc1105/article/details/8063624 SQLServer中有三个关键字可以修改比较运算符:All.Any和Some,其中Som ...
- Java对象的创建过程
//TODO https://www.cnblogs.com/chenyangyao/p/5296807.html
