P1541 乌龟棋 题解(洛谷,动态规划递推)
题目:P1541 乌龟棋
感谢大神的题解(他的写的特别好)
写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...)
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll num[+];
ll p[];
ll f[][][][];
int main()
{
ios::sync_with_stdio(false);
ll n,m;//n格子数,m牌数
cin>>n>>m;
for(ll i=;i<=n;i++)
cin>>num[i];
ll x;
for(ll i=;i<=m;i++)
cin>>x,p[x]++;//偷懒用逗号隔开 f[][][][]=num[];
for(ll a=;a<=p[];a++)
for(ll b=;b<=p[];b++)
for(ll c=;c<=p[];c++)
for(ll d=;d<=p[];d++)
{
ll r=+*a+*b+*c+*d;
if(a>=) f[a][b][c][d]=max(f[a][b][c][d],f[a-][b][c][d]+num[r]);//如果有牌出
if(b>=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b-][c][d]+num[r]);
if(c>=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-][d]+num[r]);
if(d>=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-]+num[r]);
}
cout<<f[p[]][p[]][p[]][p[]]<<endl;
}
点击加号展开代码
思路:
每个牌有四种,建立一个四维数组f[a][b][c][d]表示当现在使用了a张走一位牌,b...,c...,d张走四位牌后能获得的最大数字
然后输入数据的时候准备一个数组p[5],把a,b,c,d牌数量分别放入1,2,3,4位
然后
for(a=~p[])
for(b=~p[])
for(b=~p[])
for(b=~p[])//表示遍历a,b,c,d全部情况,我们要的是答案f[p[1]][p[2]][p[3]][p[4]]
所以要想办法递推到f[p[1]][p[2]][p[3]][p[4]]
用4个max,计算每一次的最大f[a][b][c][d],
那个递推式中:
ll r=+*a+*b+*c+*d;//r表示当前的位置,+1是,比如说a=b=c=d=0,但是他是在第一位,所以初始位是1
if(a>=) f[a][b][c][d]=max(f[a][b][c][d],f[a-][b][c][d]+num[r]);//如果有牌出
if(b>=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b-][c][d]+num[r]);
if(c>=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-][d]+num[r]);
if(d>=) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-]+num[r]);
中,a>=1是判断是否可以出牌
对于f[a-1][b][c][d]+num[r]的意思就是如果更新出了a牌之后的的数字总数,f[a][b][c][d]就是不出牌的数字总数,其实就是不变
P1541 乌龟棋 题解(洛谷,动态规划递推)的更多相关文章
- NOIP2000方格取数(洛谷,动态规划递推)
先上题目: P1004 方格取数 下面上ac代码: ///如果先走第一个再走第二个不可控因素太多 #include<bits/stdc++.h> #define ll long long ...
- P1616 疯狂的采药(洛谷,动态规划递推,完全背包)
先上题目链接:P1616 疯狂的采药 然后放AC代码: #include<bits/stdc++.h> #define ll long long using namespace std; ...
- P1060 开心的金明(洛谷,动态规划递推,01背包轻微变形题)
题目链接:P1060 开心的金明 基本思路: 基本上和01背包原题一样,不同点在于这里要的是最大重要度*价格总和,我们之前原题是 f[j]=max(f[j],f[j-v[i]]+p[i]); 那么这里 ...
- P1048 采药(洛谷,动态规划递推,01背包原题)
题目直接放链接 P1048 采药 这题只是01背包+背景故事而已 原题来的 PS:我写了一篇很详细的01背包说明,如果下面ac代码有看不懂的地方可以去看看 对01背包的分析与理解(图文) 下面上ac代 ...
- P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1<...<Ti和Ti>Ti+1>…>TK可以看出这题涉及最长上升子序列和最长下降子序列 2 ...
- 洛谷 p1541乌龟棋
洛谷 p1541乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏 ...
- 【洛谷】P1541 乌龟棋(四维背包dp)
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- 洛谷P1541 乌龟棋 [2010NOIP提高组]
P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...
- codevs1068 乌龟棋==洛谷P1541 乌龟棋
P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...
随机推荐
- Java Web项目开发中常见路径获取方法
项目绝对路径 String serverPath = request.getSession().getServletContext().getRealPath("/"); E:\J ...
- 洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]
P1525 关押罪犯 513通过 1.4K提交 题目提供者该用户不存在 标签图论并查集NOIp提高组2010 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 咳咳.竟MLE了. 囧.运行时错误 ...
- gitlab结构分析
1 gitlab的工作流程 2
- 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)
[Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...
- Tensorflow学习笔记——张量、图、常量、变量(一)
1 张量和图 TensorFlow是一种采用数据流图(data flow graphs),用于数值计算的开源软件库.其中 Tensor 代表传递的数据为张量(多维数组),Flow 代表使用计算图进行运 ...
- 记录利用CSS完美解决前端图片变形问题
在头条IT学堂看到CSS完美解决前端图片变形问题的文章,就记录分享下: 一.让图片的宽度或者高度等于容器的宽度或高度,多余的裁掉,然后让图片居中: <style type="text/ ...
- bzoj 1709: [Usaco2007 Oct]Super Paintball超级弹珠【枚举】
k是1e5范围的,吗? 注意到n只有100,这意味着k去重之后之后n^2,也就是1e4! 然后就可以愉快的n^4枚举了,枚举每个格子,再枚举每个敌人,如果当前格子射不到敌人则退出,否则满足所有敌人则a ...
- P3564 [POI2014]BAR-Salad Bar
传送门 我是来帮加藤大佬写题解的--全世界都没找到加藤大佬写法的说明--很难受-- 首先我们把\(p\)看成\(1\),\(j\)看成\(-1\),一个区间满足条件就意味着这个区间的所有前缀和都大于等 ...
- Django之序列化
关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1.serializers from django.core ...
- [读书笔记3]《C语言嵌入式系统编程修炼》
第五章 性能优化 5.1 使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法. 写一个"标准"宏MIN ...