【NOIP2010】【P1317】乌龟棋
似乎很像搜索的DP(应该也可以用搜索写)
原题:
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。
乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型的卡片,见样例),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。
游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。
很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。
现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?
对于100%的数据有1 ≤ N≤ 350,1 ≤M≤ 120,且4 种爬行卡片,每种卡片的张数不会
超过40;0 ≤ ai ≤ 100,1 ≤ i ≤ N;1 ≤ bi ≤ 4,1 ≤ i ≤M。
刚开始还以为是背包,不过这题不能用背包解决,因为背包中物品的价值是固定的,放入顺序对总价值没有影响,但是这里如果把卡片看成物品的话这个物品的价值会根据前面卡片使用顺序改变,所以不能用背包
思路就是开一个四维的f,四重循环枚举当前每种卡片用了多少,然后从上一层转移过来最大值,最后加上a(i+j*2+p*3+q*4+1)即可
应该也可以用搜索解决,不过就算搜索本质还是DP,只不过上面用for是根据前面已经得到的结果的优化现在的,搜索是根据现在的值优化以后的,两种写法代码复杂度和时间复杂度应该都差不多
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 int f[50][50][50][50]; 8 int n,m,a[1100],num[5]; 9 int main(){//freopen("ddd.in","r",stdin); 10 cin>>n>>m; 11 for(int i=1;i<=n;i++) cin>>a[i]; 12 int _id; 13 for(int i=1;i<=m;i++){ cin>>_id; num[_id]++;} 14 for(int i=1;i<=num[1]+1;i++) 15 for(int j=1;j<=num[2]+1;j++) 16 for(int p=1;p<=num[3]+1;p++) 17 for(int q=1;q<=num[4]+1;q++){ 18 f[i][j][p][q]=max(f[i][j][p][q],f[i-1][j][p][q]); 19 f[i][j][p][q]=max(f[i][j][p][q],f[i][j-1][p][q]); 20 f[i][j][p][q]=max(f[i][j][p][q],f[i][j][p-1][q]); 21 f[i][j][p][q]=max(f[i][j][p][q],f[i][j][p][q-1]); 22 f[i][j][p][q]+=a[i-1+(j-1)*2+(p-1)*3+(q-1)*4+1]; 23 } 24 cout<<f[num[1]+1][num[2]+1][num[3]+1][num[4]+1]<<endl; 25 return 0; 26 }
View Code
转载于:https://www.cnblogs.com/JSL2018/p/5876406.html
【NOIP2010】【P1317】乌龟棋相关推荐
- CJOJ 1087 【NOIP2010】乌龟棋 / Luogu 1541 乌龟棋(动态规划)
CJOJ 1087 [NOIP2010]乌龟棋 / Luogu 1541 乌龟棋(动态规划) Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个 ...
- noip2010乌龟棋解题报告
乌龟棋解题报告 题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一 的起点,第N格是终点, ...
- P1541 乌龟棋 题解(洛谷,动态规划递推)
题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc++.h> #define ...
- 【每日DP】day6 P1541 乌龟棋(四维DP)难度⭐⭐⭐
P1541 乌龟棋 四维DP--四种状态,所以四维DP f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]:表示牌号分别为1,2,3,4,的时候用了i,j,k,l张牌 思路 ...
- AcWing 312. 乌龟棋
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘只有一行,该行有 N 个格子,每个格子上一个分数(非负整数). 棋盘第 1 格是唯一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟棋子 ...
- 牛客网 【每日一题】7月27日题目精讲—乌龟棋
来源:牛客网: 乌龟棋 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 文章目录 乌龟棋 题目描述 ...
- 【codevs1068】乌龟棋noip10年TG----第二个A掉的钻石题
题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制 ...
- codevs1068 乌龟棋 题解
题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制 ...
- CODE[VS] 1068 乌龟棋
题目链接: CODE[VS]1068 乌龟棋 题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格 ...
最新文章
- Unity3d5.0 新UI之2048
- dedecms直接访问域名不能跳转到index.php怎么办
- Python面试题:如何判断字典a在字典b
- JavaScript实现topologicalSort拓扑排序算法(附完整源码)
- DNN:DL讨论与DNN经典论文汇总
- Android 内存溢出解决方案(OOM)
- python共享内存通信mapofview_python map eval strPython socket模块实现的udp通信功能示例...
- Windows下如何使用CMD命令进入MySQL数据库
- Python:利用python语言实现18位身份证号码和15位身份证号码相互转换
- [逆向]汇编movs,stos,rep指令讲解
- 用cisco服务器添加html,在接入服务器上配置基本 AAA
- 蓝桥杯魔方旋转问题(python)
- Tomb.finance每周更新(11.29-12.5)
- PY_matplotlib
- 一本通1015:计算并联电阻的阻值
- 磊科路由器如何设置虚拟服务器,nw711磊科路由器设置桥接步骤图文
- 错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配
- 七麦数据爬虫 analysis值加密
- 安装卸载提示nsis error的解决方法
- python飞船项目
热门文章
- python 矩阵点乘_Day276:普通乘积、矩阵点乘、克罗内克积
- volatile关键字和AtomicInteger
- search engine php,用php简单实现search engine friendly的url_php技巧
- php 中如何重载父类的方法_PHP中子类重载父类的方法【parent::方法名】
- 内连接查询的重点分析
- 软件:推荐5款职场人必备的效率神器APP
- SQL语言基础:常用的数据查询语句
- 收藏 | Redis 超详细总结笔记总
- 聊聊 HTTPS 和 SSL/TLS 协议
- 数据库学习建议之提高数据库速度的十条建议