题目背景

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

题目描述

乌龟棋的棋盘是一行 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. 动态规划: HDU 1789Doing Homework again

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...

  2. vmware下centos6.7网络配置

    使用NAT方式: 查看/etc/sysconfig/network-script/ 下面没有ifcfg-eth0 新建ifcfg-eth0,内容如下 DEVICE=eth0 BOOTPROTO=dhc ...

  3. .NET 之 ORM 性能评测

    .NET 之 ORM 性能评测 Why 你应该总能听到某ORM性能比Dapper高 你应该有如下疑问: 基准测试是否权威 基准测试的方式是否合理 基准测试的标准是否能够统一 统一基准测试标准/规范 如 ...

  4. Office WORD里插入图片,嵌入型只能显示一半怎么办

    如下图所示,公式编辑器插入的图片如果用嵌入型只能显示一半,但是改成其他方式即可全部显示   选中有问题的段落,点击设置为单倍行距即可  

  5. hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)

    链接:hdu 5087 题意:求第二大的最长升序子序列 分析:这里的第二大指的是,全部的递增子序列的长度(包含相等的), 从大到小排序后.排在第二的长度 cid=546" style=&qu ...

  6. iOS xmpp的使用

    #import "AppDelegate.h" //#import "DBAreaItem.h" #pragma mark - #pragma mark Pri ...

  7. linux【第六篇】用户和用户管理及定时任务复习

    定时任务复习 1.什么是定时任务? 2.如何编辑查看定时任务(配置文件位置?),语法的特殊字符意义是什么?- * , / 3.书写定时任务有哪些要领? 4.生产如何调试定时任务 5.生产场景配置定时任 ...

  8. 生成随机string

    转自:http://blog.csdn.net/yaodong_y/article/details/8115250 字母与数字的ASCII码 目 前计算机中用得最广泛的 字符集及其编码,是由美国国家标 ...

  9. 【iOS系列】-xib封装使用

    [iOS系列]-xib封装使用 Xib文件可以用来描述某一块局部的UI界面 Xib文件的加载 修改xib文件的大小size(Freeform) 第一: NSArray *objs = [[NSBund ...

  10. 授权QQ登录的qq端前端页面变迁

    ac_type = 'qq' if ac_type == 'qq': myid, mypwd = qq_key xp = '/html/body/div/div/div[2]/div/div/div/ ...