题目背景

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

题目描述

乌龟棋的棋盘是一行 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. java 并发基础,及案例分析

    对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了,然而并发问题是令我们大多数程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们深入研 ...

  2. 转:SIP相关的RFC文档索引

    索引来源于http://www.packetizer.com/ipmc/sip/standards.html SIP Standards Core SIP Documents RFC Document ...

  3. Unable to process request: General SSLEngine problem.Unable to connect to neo4j at `localhost:7687`, because the certificate the server uses has changed.

    Exception in thread "main" org.neo4j.driver.v1.exceptions.ClientException: Unable to proce ...

  4. Go -- 多个go文件包名都是main

    用go run *.go 或 go run one.go two.go main.go

  5. ASP.NET Core 奇淫技巧之动态WebApi

    一.前言 接触到动态WebApi(Dynamic Web API)这个词的已有几年,是从ABP框架里面接触到的,当时便对ABP的这个技术很好奇,后面分析了一波,也尝试过从ABP剥离一个出来作为独立组件 ...

  6. 利用百度地图Android sdk高仿微信发送位置功能

    接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶 (假设须要完整demo.请评论留下邮箱) (眼下源代码已经不发送,假设须要源代码.加qq31 ...

  7. 实例 tar备份以日期命名

    tar备份以日期命名****************************************************************************************#v ...

  8. unity3d 摄像机抖动特效

    摄像机抖动特效 在须要的地方调用CameraShake.Shake()方法就能够  

  9. python菜鸟日记1

    1. 在__init__(self,...)初始化函数中.定义对象的属性,这些属性不用所有写在括号里,括号里的表示定义的时候须要赋初始值的一些属性,而其它不用初始值的属性.能够 直接卸载代码块中,se ...

  10. Unity Critter地图导出到server配置

    普通情况下,从Critter导出的地图会与Unity自带的Navigation洪培出的地图会有比較大的差异.须要耐心调整Critter的參数才干够. 以下是我调的參数,与Unity导出的地图基本相似. ...