[动态规划][蓝桥杯 2022 省 B] 李白打酒加强版 -- 代码注释含详解

P8786 [蓝桥杯 2022 省 B] 李白打酒加强版(洛谷)

洛谷题目链接

李白打酒很快活,而我打了一晚上代码才把这题弄懂🥲

  • P8786 [蓝桥杯 2022 省 B] 李白打酒加强版(洛谷)
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
    • \***\*\*\*\*\***\*\*\***\*\*\*\*\***\*\*\*\*\***\*\*\*\*\***\*\*\***\*\*\*\*\***
    • 👏图示解析:
    • ⌨️代码:
    • ❤️当然是令人happy的`过啦!`:
  • 🤣废话解析部分
    • 根据要求分析动态转移方程
    • 分析边界值索引

题目描述

话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒 2 2 2 斗。他边走边唱:

无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店 N N N 次,遇到花 M M M 次。已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白这一路遇到店和花的顺序,有多少种不同的可能?

注意:壶里没酒( 0 0 0 斗)时遇店是合法的,加倍后还是没酒;但是没酒时遇花是不合法的。

输入格式

第一行包含两个整数 N N N M M M

输出格式

输出一个整数表示答案。由于答案可能很大,输出模 1000000007 1000000007 1000000007(即 1 0 9 + 7 10^9+7 109+7)的结果。

样例 #1

样例输入 #1

5 10

样例输出 #1

14

提示

【样例说明】

如果我们用 0 代表遇到花,1 代表遇到店, 14 14 14 种顺序如下:

010101101000000
010110010010000
011000110010000
100010110010000
011001000110000
100011000110000
100100010110000
010110100000100
011001001000100
100011001000100
100100011000100
011010000010100
100100100010100
101000001010100

【评测用例规模与约定】

对于 40 % 40 \% 40% 的评测用例: 1 ≤ N , M ≤ 10 1 \leq N, M \leq 10 1N,M10

对于 100 % 100 \% 100% 的评测用例: 1 ≤ N , M ≤ 100 1 \leq N, M \leq 100 1N,M100

蓝桥杯 2022 省赛 B 组 I 题。

********************************

👏图示解析:

动态转移方程

f[i + 1][j + 1][k - 1] += f[i][j][k];
f[i + 1][j][k * 2] += f[i][j][k];

相关图解:
图解

⌨️代码:

#include <iostream>
using namespace std;const int mod = 1000000007;				//用来取模
//const int mod = 1e9+7;				//这样写也是一样的
int dfs[201][101][101];					//dfs[N+M][M][M]
//dfs[所在的位置][这个位置喝酒的次数][该位置的酒量]
//def[i][N][k]
//因为 N <= 100 并且 M <= 100int main()
{int n, m;cin >> n >> m;dfs[0][0][2] = 1;for (int i = 0; i < m + n; i ++){//大循环表示走了m + n步,不多也不少。for (int j = 0; j < m; j ++){//0~m代表喝酒m次,也就是喝酒的次数恰好为看花的次数,不多也不少。for (int k = 0; k <= m; k ++){//k表示这个位置的酒量,可以是0,也可以和看花的次数一样if (dfs[i][j][k]){//如果这个位置存在可能到达的顺序,以下两种情况将都会发生//1.下一步是进入酒店的情况if (k <= 50) dfs[i+1][j][k*2] = (dfs[i][j][k] + dfs[i+1][j][k*2]) % mod;//测试用//printf("dfs[%d][%d][%d] = %d\n", i+1, j, k*2, dfs[i+1][j][k*2]);/*进入酒店,酒量翻倍,那么如果酒量为50,翻倍就会超过所能喝酒的最大次数上限,这时数据可能会不符合题目的给定条件和范围,又因为N,M最大可以是100,所以这个50恰好取到。*///2.下一步是进入花店的情况 (也就是喝一口酒)if (k > 0) dfs[i+1][j+1][k-1] = (dfs[i][j][k] + dfs[i+1][j+1][k-1]) % mod;//测试用//printf("dfs[%d][%d][%d] = %d\n", i+1, j+1, k-1, dfs[i+1][j+1][k-1]);/*根据题意,酒量如果是0就不能再喝酒了,所以酒量必须要比零大才可以喝酒*/}}}}cout << dfs[n + m][m][0];
}

❤️当然是令人happy的过啦!:

过啦!

🤣废话解析部分

根据要求分析动态转移方程

先来谈谈题目的要求,走 n 步,总共需要喝掉 m 次酒,每一步都只有两种可能的选择来进入到下一步:

1.进入酒店
2.喝一口酒

  • 如果是进入酒店,那么 dfs[i][j][k]中的j不变(j 表示到现该位置喝了几口酒),k*2,(k 表示身上的酒量)。
  • 如果是喝一口酒,那么 dfs[i][j][k]中的j+1(表示又喝了一口酒),k-1表示身上的酒量减少了。

再结合我们画出来的演示图,就不难得到动态转移方程了(为了方便阅读,又写了一遍)

f[i + 1][j + 1][k - 1] += f[i][j][k];
f[i + 1][j][k * 2] += f[i][j][k];

分析边界值索引

for (int i = 0; i < m + n; i ++){//大循环表示走了m + n步,不多也不少。for (int j = 0; j < m; j ++){//0~m代表喝酒m次,也就是喝酒的次数恰好为看花的次数,不多也不少。for (int k = 0; k <= m; k ++){//k表示这个位置的酒量,可以是0,也可以和看花的次数一样if (dfs[i][j][k]){//如果这个位置存在可能到达的顺序,以下两种情况将都会发生

代码中出现了三处的边界值,其中i循环j循环不需要管理最后的边界位置,只需要知道,i循环进行了m + n次,表示走了m + n步,经过了m + n个位置。

同样的,j循环每一步喝酒的次数可能性,这里的思想类似于桶排序,主要是利用哈希属性来进行映射。

j表示看花次数,也是喝酒的次数,范围在[0, m - 1],其实也可以是[1, m],如果是[1, m],最后答案的索引要进行更改。

k表示李白身上的酒量,范围在[0, M]之间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

-bash: unzip: 未找到命令的解决方案

遇到 -bash: unzip: 未找到命令 这样的错误信息&#xff0c;表示你的系统中没有安装 unzip 工具。unzip 是一个常用的解压工具&#xff0c;用于解压缩 .zip 文件。你可以通过系统的包管理器安装它。 根据你使用的 Linux 发行版&#xff0c;安装 unzip 的命令会有所不同。下面是…

MUMU模拟器12连logcat的方法

大家好&#xff0c;我是阿赵。   在开发手机游戏的时候&#xff0c;在真机上会出现各种问题&#xff0c;在查询问题的时候&#xff0c;安卓手机需要用adb连接来连接手机看logcat输出分析问题。但由于连接手机比较麻烦&#xff0c;所以我都习惯在电脑用安卓模拟器来测试。   …

通过vue ui创建项目

确认前端环境都安装好之后 打开黑窗口 输入 vue ui 会打开一个vue的网页 在此创建项目 可以选择在那个路径创建 这是我的项目配置 这里是选择vue版本 我要用的是vue2 选好点击创建项目就好了 创建好后的重点的目录结构以及结构的作用 启动前端工程 将创建好的项目导入编译器 我…

跨境干货 | 想“躺平式”经营?TikTok Shop全托管模式入驻了解一下!

在当前跨境电商出海模式不断升级的背景下&#xff0c;全托管模式已经成为各类平台的标准配置。其中&#xff0c;TikTok全托管模式已经上线运行有很长一段时间了&#xff0c;这个模式下&#xff0c;主打一个“仅供货、免运营”&#xff0c;它降低了商家进入和运营TikTok市场的门…

liunx操作系统 环境变量

环境变量 main函数参数 命令行参数环境变量 环境变量的查看环境变量的获取 main函数参数 命令行参数 main函数是有参数的&#xff0c;只是我们一般不适用 这是main函数从bash中读取进程数据使用的一个基本入口。 下面进行简单演示。 o 好oo都是我们输入的命令行参数。其实&a…

【Linux】开始使用gdb吧!

开始使用gdb吧&#xff01; 1 下载安装2 开始使用3 实践运用补充一下 print 的 功能 &#xff08;类似监视窗口的作用&#xff09;和显示堆栈的功能Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&am…

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球&#xff0c;给人留下深刻的印象。作为前端开发人员&#xff0c;可以通过不断学习和掌握设计技巧和工具&#xff0c;提升自己的UI设计能力&#xff0c;为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议&#xff1a; 学习设计基础知…

仿牛客网项目---消息队列的实现

本篇文章讲一讲我们的项目中用到的消息队列。 1.阻塞队列 2.kafka 我的项目为什么要用消息队列&#xff1f; 如果采用消息队列&#xff0c;那么评论、点赞、关注三类不同的事&#xff0c;可以定义三类不同的主题&#xff08;评论、点赞、关注&#xff09;&#xff0c;发生相应…

AI Agents之CrewAI智能体开发框架

一、前言 AI Agents 的开发是当前软件创新领域的热点。随着大语言模型 (LLM) 的不断进步&#xff0c;预计 AI 智能体与现有软件系统的融合将出现爆发式增长。借助 AI 智能体&#xff0c;我们可以通过一些简单的语音或手势命令&#xff0c;就能完成以往需要手动操作应用程序才能…

片上网络(NoC)技术的发展及其给高端FPGA带来的优势

片上网络(NoC)技术的发展及其给高端FPGA带来的优势 1. 概述 在摩尔定律的推动下,集成电路工艺取得了高速发展,单位面积上的晶体管数量不断增加。 片上系统(System-on-Chip,SoC)具有集成度高、功耗低、成本低等优势,已经成为大规模集成电路系统设计的主流方向,解决了…

java017 - Java抽象类

1、概述 一般情况&#xff0c;动物是抽象的&#xff0c;所以不能被new,比如你在Animal类中定义一个成员方法eat,你不能定义具体内容&#xff0c;比如吃鱼或者吃白菜&#xff0c;因为动物是抽象的。 一个没有方法体的方法&#xff0c;应该定义为抽象方法&#xff0c;而类中如果…

I’m stuck!(CCF201312-5)解析(java实现)

代码 package test_201312;import java.util.Scanner;/** 201312-5 试题名称&#xff1a; I’m stuck! 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给定一个R行C列的地图&#xff0c;地图的每一个方格可能是#, , -, |, ., S, T七…

2024年最佳硬盘!为台式电脑、NAS等产品量身定做的顶级机械硬盘

机械硬盘&#xff08;HDD&#xff09;可能看起来像是古老的技术&#xff0c;但它们仍然在许多地方提供“足够好”的性能&#xff0c;并且它们很容易以同等的价格提供最多的存储空间。 尽管最好的SSD将为你的操作系统和引导驱动器提供最好的体验&#xff0c;并提供比HDD更好的应…

C++项目--高并发内存池

目录 一、项目介绍二、内存池介绍2.1 池化技术2.2 内存池2.3 内存池主要解决的问题2.4 malloc 三、定长内存池的实现3.1 定长内存池概念3.2 内存池管理释放对象3.3 内存池申请对象3.4 定长内存池整体代码3.5 性能对比 四、高并发内存池整体框架设计4.1 该项目解决的问题4.2 整体…

Pytorch学习 day06(torchvision中的datasets、dataloader)

torchvision的datasets 使用torchvision提供的数据集API&#xff0c;比较方便&#xff0c;如果在pycharm中下载很慢&#xff0c;可以URL链接到迅雷中进行下载&#xff08;有些URL链接在源码里&#xff09;代码如下&#xff1a; import torchvision # 导入 torchvision 库 # …

VM 虚拟机 ubuntu 解决无法连接网络问题

添加网卡法 就是在虚拟机的设置那里多增加一个网卡

如何度量关键成果KR的完成情况?

明确度量指标 首先&#xff0c;需要为每一个关键成果&#xff08;Key Result&#xff09;设定明确的度量指标。这些指标应该是具体、可衡量的&#xff0c;以便能够清晰地反映关键成果的完成情况。例如&#xff0c;如果关键成果是提高网站的用户转化率&#xff0c;那么度量指标…

论文阅读_解释大模型_语言模型表示空间和时间

英文名称: LANGUAGE MODELS REPRESENT SPACE AND TIME 中文名称: 语言模型表示空间和时间 链接: https://www.science.org/doi/full/10.1126/science.357.6358.1344 https://arxiv.org/abs/2310.02207 作者: Wes Gurnee & Max Tegmark 机构: 麻省理工学院 日期: 2023-10-03…

滑动窗口算法

前言 滑动窗口作为一个考点较高的算法&#xff0c;广泛应用于子串问题中&#xff0c;本文将进行详细讲解。 一、滑动窗口是什么 滑动窗口是双指针算法的一种&#xff0c;基本思路为维护一个窗口&#xff0c;然后从前往后遍历元素进行运算。 二、滑动窗口算法和其他双指针算法…

Unity Samples和帧动画的问题

拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy&#xff0c;然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因&#xff0c;而且Unity把Samples这个…