[蓝桥杯 2022 省 B] 李白打酒加强版

题目链接

[蓝桥杯 2022 省 B] 李白打酒加强版

题目描述

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

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

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

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

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

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

输入格式

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

输出格式

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

输入输出样例
输入
5 10
输出
14
数据范围
  • 1 ≤ n , m ≤ 100 1 \leq n, m \leq 100 1n,m100

解法:动态规划

我们定义 f ( i , j , k ) f(i,j,k) f(i,j,k) 为 遇到店 i i i 次,遇到花 j j j 次,酒壶里有 k k k 斗酒的方案数。

我们最终要返回的是 遇到店 n n n次, 遇到花 m m m且最后一次遇到的是花,酒壶里有 0 0 0 斗酒的方案数。

实际上,它等价于 遇到店 n n n次, 遇到花 m − 1 m - 1 m1 次 ,酒壶里有 1 1 1 斗酒的方案数。因为这样保证了最后一次是遇到花的,两者实际等价,即 f ( n , m − 1 , 1 ) f(n, m - 1, 1) f(n,m1,1)

由于 m m m 不超过 100 100 100,那么 k k k 也不超过 100 100 100否则喝不完酒

我们直接讨论当前遇到的是店,还是花:

  • 如果当前遇到的是,那么 f [ i ] [ j ] [ k ] = f [ i ] [ j ] [ k ] + f [ i − 1 ] [ j ] [ k / 2 ] f[i][j][k] = f[i][j][k] + f[i - 1][j][k / 2] f[i][j][k]=f[i][j][k]+f[i1][j][k/2],这里需要保证 i > 0 i > 0 i>0 k m o d 2 = 0 k \ mod\ 2 = 0 k mod 2=0
  • 如果当前遇到的是,那么 f [ i ] [ j ] [ k ] = f [ i ] [ j ] [ k ] + f [ i ] [ j − 1 ] [ k + 1 ] f[i][j][k] = f[i][j][k] + f[i][j-1][k+1] f[i][j][k]=f[i][j][k]+f[i][j1][k+1],这里需要保证 j > 0 j > 0 j>0

初始 f [ 0 ] [ 0 ] [ 2 ] = 1 f[0][0][2] = 1 f[0][0][2]=1,表示最开始酒壶里有 2 2 2 斗酒。

最终返回的答案就是 f [ n ] [ m − 1 ] [ 1 ] f[n][m-1][1] f[n][m1][1]

时间复杂度: O ( n × m × k ) O(n \times m \times k) O(n×m×k)

C++代码:

#include <iostream>
#include <cstring>
#include <vector>
#include <functional>
#include <unordered_set>
#include <set>
#include <algorithm>using namespace std;
using LL = long long;const int MOD = 1e9 + 7;
const int N = 110;LL f[N][N][N];void solve(){int n, m;cin>>n>>m;f[0][0][2] = 1;for(int i = 0;i <= n;i++){for(int j = 0;j < m;j++){if(i == 0 && j == 0) continue; for(int k = 0;k <= 100;k++){if(k % 2 == 0 && i) f[i][j][k] += f[i - 1][j][k / 2];//操作1if(j)               f[i][j][k] += f[i][j - 1][k + 1];//操作2f[i][j][k] %= MOD;}}}cout<<f[n][m - 1][1];
}int main(){int t = 1;//cin>>t;while(t--){solve();}return 0;
}

Java代码:

import java.util.*;
import java.io.*;public class Main
{static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));static final int N = 110;static final int MOD = 1000_000_007;public static void main(String[] args) throws Exception{String[] strs = reader.readLine().split(" ");int n = Integer.parseInt(strs[0]);int m = Integer.parseInt(strs[1]);int[][][] f = new int[N][N][N];f[0][0][2] = 1;for(int i = 0;i <= n;i++){for(int j = 0;j <= m;j++){if(i == 0 && j == 0) continue;for(int k = 0;k <= 100;k++){if(k % 2 == 0 && i > 0) f[i][j][k] += f[i - 1][j][k / 2];if(j > 0)               f[i][j][k] += f[i][j - 1][k + 1];f[i][j][k] %= MOD;}}}System.out.println(f[n][m - 1][1]);}
}

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

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

相关文章

python_绘图_多条折线图绘制_显示与隐藏

1. 需求 给定一个二维数组 100行, 5列, 每一列绘制一条折线, 横轴为行索引, 纵轴为对应位置的值, 绘制在一个子图里面, 使用python plot, 使用随机颜色进行区别添加显示和隐藏按钮, 可以对每条折线进行显示和隐藏 2. 代码 import numpy as np import matplotlib.pyplot as p…

为什么说FMEA是最主要的可靠性设计工具?——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA&#xff0c;即故障模式与影响分析&#xff08;Failure Modes and Effects Analysis&#xff09;&#xff0c;是一种预防性的质量工具&#xff0c;广泛应用于各种工程领域&#xff0c;特别是在产品设计和制造过程中。它通过对产品或过程中…

工具_git提交时忽略某些文件或者目录,git提交排除某些文件或目录

git 提交时如果想忽略某些文件或者目录&#xff1a; 1.在根目录下创建 .gitignore 文件 2.在该文件中直接添加内容&#xff0c;如&#xff1a; 忽略.mdb、.sln、.sln,.config 文件&#xff0c;不忽视 .txt 文件 *.mdb *.ldb *.sln .config !.txt 忽略Debug目录及文件&#…

4月2日 qt密码生成小程序(可选择生成密码的格式),基于Python框架下的pyqt6

4月2日 密码生成小程序 代码展示&#xff1a; import stringfrom PyQt6.QtWidgets import (QApplication, QDialog,QMessageBox ) from untitled import Ui_PasswordGender import sys import string # py模块含有字符 import randomclass MyPasswordGenerate(Ui_Password…

快速入门Linux,Linux岗位有哪些?(一)

文章目录 Linux与Linux运维操作系统&#xff1f;操作系统图解 认识LinuxLinux受欢迎的原因什么是Linux运维Linux运维岗位Linux运维岗位职责Linux运维架构师岗位职责Linux运维职业发展路线计算机硬件分类运维人员的三大核心职责 运维人员工作&#xff08;服务器&#xff09;什么…

python爬虫----了解爬虫(十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

6000000IOPS!FASS×kunpeng920全新突破

实测数据详见下文 网络环境 前端和后端网均采用100GE网络&#xff0c;管理网采用1Gbps以太网。 前端网和后端网通过不同网段隔离&#xff0c;与管理网物理隔离。 软硬件配置 存储端配置&#xff1a; 客户端配置&#xff1a; 软件配置&#xff1a; 存储集群配置&#xff1a; …

【MapBox】实现实时飞行轨迹功能

之前写了一篇MapBox添加带箭头的轨迹线&#xff0c;现在在这个基础之上实现获取到无人机的推送点位数据实时飞行的功能 首先创建实例&#xff0c;将无人机的图标加载在地图上 const MAP_UAV_FLIGHT_ING (values, layerKey 无人机飞行) > {ClearUAVMap();const map GET_…

认证的无线网络安全

​在今天&#xff0c;大多数计算机网络都是无线网络&#xff0c;更易管理&#xff0c;移动性更强&#xff0c;而且成本也更低。而另一方面&#xff0c;无线网络也更容易受到攻击&#xff0c;因为企业无法将网络的物理范围控制在办公楼内&#xff0c;大街或停车场上的任何人都有…

postgresql数据库扩展之fdw

1.介绍 PostgreSQL中的Foreign Data Wrapper&#xff08;FDW&#xff09;是一个强大的功能&#xff0c;它允许你访问和操作存储在外部源中的数据&#xff0c;就好像它是PostgreSQL数据库内的一个表一样。这意味着你可以直接从PostgreSQL查询和联接不同数据库和系统中的数据。F…

Linux面试题汇总!附答案详解!学习提升必备!(30w+收藏)

Linux 概述 什么是Linux Unix和Linux有什么区别&#xff1f; 什么是 Linux 内核&#xff1f; Linux的基本组件是什么&#xff1f; Linux 的体系结构 BASH和DOS之间的基本区别是什么&#xff1f; Linux 开机启动过程&#xff1f; Linux系统缺省的运行级别&#xff1f; L…

高效学习方法:冥想背诵,看一句念一句,再每个词分析位置及语法等合理性,忘记哪个词再看猜下为什么会忘,跟自己的表达哪里不一样。

原则&#xff1a;易学则易行&#xff0c;则效果最好。《易经》 你提到的这种学习方法结合了多种记忆和理解技巧&#xff0c;可以帮助提高学习效率。下面是对这种方法的一个详细解释和一些建议&#xff1a; 冥想背诵&#xff1a;通过冥想来集中注意力&#xff0c;可以帮助你在没…

批量邮箱API发送邮件时如何提高发送效率?

批量邮箱API发送邮件的方法&#xff1f;如何用API批量发送邮件&#xff1f; 如何在使用批量邮箱API发送邮件时提高发送效率&#xff0c;却是众多企业和开发者所关注的焦点。AokSend将从多个方面探讨如何优化批量邮箱API发送邮件的效率&#xff0c;确保邮件能够迅速、准确地送达…

数字化转型不能单打独斗

在企业数字化建设的征程中&#xff0c;很多企业领导忽视了一个关键环节&#xff0c;那就是企业的组织能力。许多领导误以为软件公司可以包办任何问题&#xff0c;认为只要出钱就能享受贴身服务&#xff0c;甚至认为只需签署合同软件公司就会对甲方尽心尽责。然而&#xff0c;数…

❤️算法学习网站推荐

推荐一些学习网站 学习&#xff1a; B 站大学 YYDS CS 自学指南 算法通关手册 代码随想录 OI WIKI Hello 算法 刷题&#xff1a; 力扣洛谷DotCPP(C 语言网-含教程)Acwing蓝桥杯官网 算法可视化&#xff1a; 炼金术士 Alchemist

【C++】vector系列力扣刷题日志(136.只出现一次的数字,118.杨辉三角,26.删除有序数组中的重复项,260.只出现一次的数字 |||)

目录 136.只出现一次的数字 118.杨辉三角 26.删除有序数组中的重复项 260.只出现一次的数字 ||| vector的详细介绍及用法这里就不过多赘述了&#xff0c;可以参考上一篇博客&#xff1a;vector的介绍及使用说明 136.只出现一次的数字 题目&#xff1a; 给你一个 非空 整数…

开源代码分享(17)—基于yalmip+cplex的微电网优化调度(附matlab代码)

1基本概念 微网&#xff08;Micro-Grid&#xff0c;MG&#xff09;是进行电能调度时常见的概念&#xff0c;作为组织各分布式单元的结构。微网概念的提出旨在实现分布式电源的灵活、高效应用&#xff0c;解决数量庞大、形式多样的分布式电源并网问题[8]。微网中集成了电源、储能…

ZooKeeper 的持久化机制

持久化的定义&#xff1a; 数据&#xff0c;存到磁盘或者文件当中。机器重启后&#xff0c;数据不会丢失。内存 -> 磁盘的映射&#xff0c;和序列化有些像。 ZooKeeper 的持久化&#xff1a; SnapShot 快照&#xff0c;记录内存中的全量数据TxnLog 增量事务日志&#xff…

【机器学习算法介绍】(1)K近邻算法

K近邻算法(K-Nearest Neighbors,KNN)是一种基本的分类与回归方法。这个算法的思想非常简单、直观,但却非常强大。它既可以用于分类,也可以用于回归。 KNN算法原理 KNN工作原理可以概括为:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属…

kubeadm部署的k8s1.29集群证书更新

1、查看证书有效期 kubeadm certs check-expiration更新证书前&#xff1a; [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can look at this config file with kubectl -n kube-system get cm kubeadm-config -o yamlCERTIFIC…