P1541 乌龟棋 题解(洛谷,动态规划递推)

news/2024/7/2 23:28:46

题目:P1541 乌龟棋

感谢大神的题解(他的写的特别好)

写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...)

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll num[350+100];
ll p[5];
ll f[41][41][41][41];
int main()
{ios::sync_with_stdio(false);ll n,m;//n格子数,m牌数cin>>n>>m;for(ll i=1;i<=n;i++)cin>>num[i];ll x;for(ll i=1;i<=m;i++)cin>>x,p[x]++;//偷懒用逗号隔开
f[0][0][0][0]=num[1];for(ll a=0;a<=p[1];a++)for(ll b=0;b<=p[2];b++)for(ll c=0;c<=p[3];c++)for(ll d=0;d<=p[4];d++){ll r=1+1*a+2*b+3*c+4*d;if(a>=1) f[a][b][c][d]=max(f[a][b][c][d],f[a-1][b][c][d]+num[r]);//如果有牌出if(b>=1) f[a][b][c][d]=max(f[a][b][c][d],f[a][b-1][c][d]+num[r]);if(c>=1) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-1][d]+num[r]);if(d>=1) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-1]+num[r]);}cout<<f[p[1]][p[2]][p[3]][p[4]]<<endl;
}
点击加号展开代码

思路:

每个牌有四种,建立一个四维数组f[a][b][c][d]表示当现在使用了a张走一位牌,b...,c...,d张走四位牌后能获得的最大数字

然后输入数据的时候准备一个数组p[5],把a,b,c,d牌数量分别放入1,2,3,4位

 

然后

for(a=0~p[1])for(b=0~p[2])for(b=0~p[3])for(b=0~p[4])//表示遍历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=1+1*a+2*b+3*c+4*d;//r表示当前的位置,+1是,比如说a=b=c=d=0,但是他是在第一位,所以初始位是1
if(a>=1) f[a][b][c][d]=max(f[a][b][c][d],f[a-1][b][c][d]+num[r]);//如果有牌出
if(b>=1) f[a][b][c][d]=max(f[a][b][c][d],f[a][b-1][c][d]+num[r]);
if(c>=1) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-1][d]+num[r]);
if(d>=1) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-1]+num[r]);

中,a>=1是判断是否可以出牌

 

对于f[a-1][b][c][d]+num[r]的意思就是如果更新出了a牌之后的的数字总数,f[a][b][c][d]就是不出牌的数字总数,其实就是不变

 

转载于:https://www.cnblogs.com/zyacmer/p/9977084.html


http://lihuaxi.xjx100.cn/news/235881.html

相关文章

【重磅上线】思维导图工具XMind:ZEN基础问题详解合集

XMind是XMind Ltd公司旗下一款出色的思维导图和头脑风暴软件。黑暗的UI设计、独特的ZEN模式、丰富的风格和主题、多分支的颜色等等功能会让你的工作更加便捷与高效。在视觉感官上也会给你带来最佳的体验感。 对于初学者来说&#xff0c;肯定会遇到各种各样的问题&#xff0c;有…

Ansible03-管理变量、加密、事实

目录 一、管理变量 1.1、变量的基本用法 1.2、使用已注册变量捕获命令输出 二、管理加密 2.1、ansible-vault常用场景 三、管理事实 3.1、事实基本用法 3.2、创建自定义事实 3.3、魔法变量hostvars、group_names、groups、inventory_hostname 一、管理变量 1.1、变量…

iOS图像识别

iOS通过摄像头动态识别图像 前言&#xff1a; 目前的计算机图像识别&#xff0c;透过现象看本质&#xff0c;主要分为两大类: 基于规则运算的图像识别&#xff0c;例如颜色形状等模板匹配方法基于统计的图像识别。例如机器学习ML&#xff0c;神经网络等人工智能方法**区别&…

java B2B2C源码电子商务平台 -commonservice-config配置服务搭建

2019独角兽企业重金招聘Python工程师标准>>> Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server&#xff0c;您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与Spring Environment和PropertySource抽象…

Ansible04-任务控制

目录 一、循环 二、条件 三、handlers 四、失败的处理 一、循环 使用 loop 关键字对一组项目迭代任务&#xff0c;循环变量 item 保存每个迭代过程中使用的值。 [studentworkstation ansible]$ vim loop.yml --- - name: Test loophosts: devgather_facts: novars:num:- …

383. Ransom Note/691. Stickers to Spell Word-- String, Map, back tracking-- 未完待续

383 easy 题&#xff0c;就是建立字母的hash 表 看第一个String 是否能被第二个String 所构建 canConstruct("aa", "aab") -> true 统计 第二个参数中每个字母的频率&#xff0c;可以用一个int[256] 建立hashmap, 然后统计 第一个String 中字母出现的…

你猜猜typeof (typeof 1) 会返回什么值(类型)?!

typeof typeof操作符返回一个字符串&#xff0c;表示未经计算的操作数的类型。 语法&#xff1a; var num a; console.log(typeof (num)); 或console.log(typeof num) 复制代码typeof 可以返回的类型为&#xff1a;number、string、boolean、undefined、null、object、functi…

Ansible05-部署文件

目录 一、部署文件的常用模块 二、使用jinja2文件部署自定义文件 一、部署文件的常用模块 部署文件常用模块有 file 创建、删除文件或目录&#xff0c;修改selinux上下文。copy 复制文件到受控节点上&#xff0c;也可以直接在受控结点上创建文件。fetch 从受控结点获取文件…