题目背景

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

题目描述

乌龟棋的棋盘是一行 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 个整数,表示小明最多能得到的分数。

输入输出样例

输入样例#1:

9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1
输出样例#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】的更多相关文章

  1. P1541 乌龟棋 线性dp

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏要求玩家控制一个乌龟棋子 ...

  2. Luogu P1541 乌龟棋(NOIP2010TG)

    自己的第一篇博文 祭一下祭一下 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点, ...

  3. LuoGu P1541 乌龟棋

    题目传送门 乌龟棋我并不知道他为啥是个绿题0.0 总之感觉思维含量确实不太高(虽然我弱DP)(毛多弱火,体大弱门,肥胖弱菊,骑士弱梯,入侵弱智,沙华弱Dp) 总之,设计出来状态这题就很简单了 设 f[ ...

  4. 洛谷P1541 乌龟棋(四维DP)

    To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...

  5. 【题解】 Luogu P1541 乌龟棋总结 (动态规划)

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  6. P1541 乌龟棋(DP)

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NNN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NNN格是终点,游戏要求玩家控制一个乌龟 ...

  7. [NOIp2010] luogu P1541 乌龟棋

    英语老师讲 mind map,真想说一句"声微饭否".为什么wyy的歌词总是快一点点.在报csp. 题目描述 你在一个序列上向正方向行走,起点是 a[0]a[0]a[0].每一步可 ...

  8. 洛谷$1541$ 乌龟棋 线性$DP$

    Luogu   CH Sol f[i]表示走到第i个格子时获得的最大分数 发现转移与各个爬行卡片的数量有关,一共只有4种卡片 所以就把这四种卡片的已使用张数也放进状态,f[i][a][b][c][d] ...

  9. 【洛谷】P1541 乌龟棋(四维背包dp)

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

随机推荐

  1. git服务端安装

    Windows平台下Git服务器搭建 第一步:下载Java,下载地址:http://www.java.com/zh_CN/  注意要下载是完整的JDK(其中有jre) 第二步:安装Java.安装步骤不 ...

  2. Spring基于Java的配置

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/java-based-configuration.html: 基于Java的配置选项,可以使你在不用 ...

  3. JAVA_如何复制项目

    如何复制一个项目:复制这个项目,直接粘贴为一个新项目   注意复制完了之后一定要改一下Web Context-root   然后重新部署(注意Servers的Tomcat会变成当前项目,还要注意他的L ...

  4. OpenCV实践之路——Python的安装和使用

    本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50936076 微博:http ...

  5. Android之——监听手机开机事件

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47028535 本文中,主要通过监听开机广播来达到监听手机开机状态的操作.在Andr ...

  6. su: /bin/bash: Permission denied带来的疑惑

    >客户一个oracle突然当机了,由于业务启动,客户下意识的重启了服务器,系统是起来了,准备切换到oracle用户下启动数据库,可以怎么都无法su切换,真是火上浇油呀,描述如下: 在root用户 ...

  7. C++的cout高阶格式化操作

    这篇文章主要讲解如何在C++中使用cout进行高级的格式化输出操作,包括数字的各种计数法(精度)输出,左或右对齐,大小写等等.通过本文,您可以完全脱离scanf/printf,仅使用cout来完成一切 ...

  8. MFC项目实战(1)文件管理器--界面设计篇

    1.创建项目 文件管理器是一个基于对话框的应用程序.首先新建一个“MFC应用程序”类型的项目,然后输入新建项目的名称“FileMng”,并指定该项目保存的位置,单击“确定”按钮,如图所示. 在弹出的“ ...

  9. C项目实践--图书管理系统(4)

    前面已经把图书管理系统的所有功能模块都已实现完毕了,下面通过运行来分析该系统的操作流程并检验是否符合逻辑设计要求. 3.系统操作过程 F5 运行 1.登录系统 系统运行之后,提示输入用户名和密码,系统 ...

  10. 基于字符的打印机 图形化打印机 PostScript解释器

    60行*80字符/行=4800字节 300点/英寸(300DPI)   8*10英寸/页打印区域 光栅图像处理器  RIP PostScript程序--- > PostScript解释器 --& ...