【2024.1.30练习】李白打酒加强版(25分)

题目描述


题目思路

在最多数据的情况下,有100个店100朵花,总情况为C_{200}^{100}的天文数字,暴力枚举已经不可能实现,考虑使用动态规划解决问题。最后遇到的一定是花,所以思路更倾向于倒推。

建立二维数组dp[i][j],容易联想到i为经过的花数,j为经过的店数,dp[i][j]的值代表此时酒量。但是这样i , j不能确定唯一的dp[i][j]。且酒壶中的酒量最大可能达到2^{100}数量级,如何储存这个大数据也是问题。

再关注数学问题本身。设第i次遇到店添加的酒量为A_{i},易得:

2+\sum_{1}^{N}A_i=M \leftrightharpoons A_1+A_2+A_3+...+A_N=M-2

根据题意,壶中酒量最大也不会超过100斗,极大简化了数据量。

此外由数据范围可以得到M<=2或N-M>7时无解,可以拿到极端测试点的分数。

在设计状态困难的情况下先找递推关系,写几组排列组合可以得到:

A(i,j)i个店j朵花的排列组合总数,则A(i,j) = A(i-1,j)+A(i,j-1)

这样可以得到有关店数和花数的状态转移方程,然而这道题还与壶中酒量这一额外变量有关,因此考虑用三维数组存储数据。设计三维数组dp[i][j][k]dp[i][j][k]的值代表为经过i个店,j朵花时壶中的酒量为k的方案数。初始状态显然为:

dp[0][0][k]=\begin{cases} & 1\text{ (k =2) } \\ & 0\text{ (k!=2) } \end{cases}
dp[1][0][k]=\begin{cases} & 1\text{ (k =4) } \\ & 0\text{ (k!=4) } \end{cases}

dp[0][1][k]=\begin{cases} & 1\text{ (k =1) } \\ & 0\text{ (k!=1) } \end{cases}

实际上后两个式子都能被递推出来,是多余的。接下来建立状态转移方程:

dp[i][j][k]=dp[i-1][j][\tfrac{k}{2}]+dp[i][j-1][k+1] \ \ \ (\tfrac{k}{2}\in \mathbb{Z}) 

dp[i][j][k]=dp[i][j-1][k+1] \ \ \ (\tfrac{k}{2}\notin \mathbb{Z}) 

第二个式子省略了最后遇到的是店的情况,因为此时酒量为奇数,不可能遇到店。但是用上面的状态转移方程可能会出现i-1j-1为负值的情况,因此完整的状态转移方程如下:

dp[i][j][k]=dp[i-1][j][\tfrac{k}{2}]+dp[i][j-1][k+1] \ \ \ (\tfrac{k}{2}\in \mathbb{Z}\bigcap_{}^{}i-1,j-1\in \mathbb{N})

dp[i][j][k]=dp[i][j-1][k+1] \ \ \ (\tfrac{k}{2}\notin \mathbb{Z}\bigcup i-1\notin \mathbb{N})

dp[i][j][k]=dp[i-1][j][\tfrac{k}{2}] \ \ \ (\tfrac{k}{2}\in \mathbb{Z}\bigcap_{}^{} j-1\notin \mathbb{N})

最终剩下的是一朵花和一斗酒。因此我们递推完成后,只需查看dp[N][M-1][1]的值,即可获取答案。


我的代码

#include <iostream>
#include <algorithm>
using namespace std;
int dp[101][101][101];
int main() {
	int n;
	int m;
	cin >> n >> m;
	//设置初始状态
	int i;
	int j;
	int k;
	for (i = 0; i < 101; i++)
	{
		if (i == 2) {
			dp[0][0][i] = 1;
		}
		else {
			dp[0][0][i] = 0;
		}
	}
	//动态规划
	for (i = 0; i <= n; i++)
	{
		for (j = 0; j <= m; j++)
		{
			for ( k = 0; k <= 100; k++)
			{
				//分类讨论
				if (k % 2 == 0 && i >= 1 && j >= 1) {
					dp[i][j][k] = (dp[i - 1][j][k / 2] + dp[i][j - 1][k + 1])% 1000000007;
				}
				else if ((k % 2 != 0 || i <= 1) && j >= 1) {
					dp[i][j][k] = (dp[i][j - 1][k + 1]) % 1000000007;
				}
				else if (k % 2 == 0 && j <= 1 && i >= 1) {
					dp[i][j][k] = (dp[i - 1][j][k / 2]) % 1000000007;
				}
			}
		}
	}
	//获取答案
	int ans = dp[n][m - 1][1];
	cout << ans;
	return 0;
}

记得数据可能过大,每次运算都要取模。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件个性化选型:制造企业如何选择适合自身的工单管理系统-亿发

企业制造业是实体经济中非常重要和基础的组成部分&#xff0c;直接关系到国家经济的血脉。然而&#xff0c;传统制造业在生产与管理上所采用的老一套方法和经验已不再适应当下的发展需求。信息化、数字化和智能化被视为制造企业的必然趋势。要想在竞争激烈的市场中永立潮头&…

都2024年了,谁还在逛良品铺子?

作者 | 辰纹 来源 | 洞见新研社 2019年年初&#xff0c;良品铺子举办了一场高端零食战略发布会&#xff0c;当时还花重金请来顶流明星为品牌代言&#xff0c;在强化“高端零食”定位的同时&#xff0c;良品铺子坚定的表示&#xff0c;要“抛弃价格战”。 时任良品铺子董事长杨…

24小时涨粉10w+的AI小游戏-哄哄模拟器

近年来&#xff0c;随着chatGPT的爆火&#xff0c;一系列的AI应用应运而生。比如&#xff1a;AI绘画&#xff0c;AI写作等。今天我们来看看最近很火的一个AI小游戏-哄哄模拟器。 1. 试玩体验 这款游戏名叫“哄哄模拟器”&#xff0c;体验地址为&#xff1a;https://hong.grea…

RGMII接口介绍

RGMII接口概述 RGMII全称为Reduced Gigabit Media Independent Interface&#xff0c;是一种网络接口标准&#xff0c;用于千兆以太网芯片与PHY芯片之间的接口标准。RGMII接口的设计目的是为了减少I/O的数量&#xff0c;尽可能减小网卡PCB占用面积&#xff0c;同时提高数据传输…

Nacos服务注册源码:客户端

入口 我们就拿nacos自己example下的NamingExample来做测试 public class NamingExample {public static void main(String[] args) throws NacosException, InterruptedException {Properties properties new Properties();properties.setProperty("serverAddr", …

如何在DBeaver中重命名数据库

前言 DBeaver是一款强大的开源通用数据库管理和开发工具&#xff0c;支持多种数据库类型。在某些数据库系统中&#xff0c;你可以直接通过DBeaver的图形界面来重命名数据库名称。本文将详细介绍如何在DBeaver中进行数据库重命名操作。 重要提示&#xff1a; 对于不同的数据库…

Leetcode—2396. 严格回文的数字【中等】

2024每日刷题&#xff08;一零六&#xff09; Leetcode—2396. 严格回文的数字 算法思想 实现代码 class Solution { public:bool isStrictlyPalindromic(int n) {return false;} };运行结果 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&…

vue2 国际化的使用,自动翻译文件,自动生成国际化文件

vue2 国际化的使用&#xff0c;自动翻译文件&#xff0c;自动生成国际化文件 npm i vue-i18n6 文件代码 // zh.js 用来写全局通用的国际化 export default {home:"首页" }//en.js 用来写全局通用的国际化 export default {home:"home page" }//kor.js …

窗口函数rows between 、range between的区分

【移动窗口】 移动窗口&#xff0c;顾名思义&#xff0c;“窗口”&#xff08;也就是操作数据的范围&#xff09;不是固定的&#xff0c;而是随着设定条件逐行移动的。 在over后面的子句中&#xff0c;使用rows加“范围关键字”可以设置移动窗口&#xff0c;语法如下&#xf…

ESP32 看门狗:保障系统稳定运行的重要机制

ESP32 看门狗&#xff1a;保障系统稳定运行的重要机制 导言&#xff1a; 在嵌入式系统开发中&#xff0c;系统稳定性是至关重要的。为了应对系统出现异常情况或者死锁等问题&#xff0c;ESP32提供了看门狗&#xff08;Watchdog&#xff09;机制。本文将深入探讨ESP32看门狗的工…

内网穿透的应用-如何搭建FastDFS文件服务器并实现无公网ip访问本地文件服务

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

Docker的优化和私有容器的部署管理

1 Docker的优化和配置调整 1.1 如何缩小镜像的体积大小 1&#xff09;尽可能使用小体积的基础镜像&#xff08;一般推荐使用alpine阿尔卑斯镜像&#xff09; 2&#xff09;尽可能的减少dockfile指令的数量从而来减少镜像的层数 3&#xff09;在RUN指令末尾添加安装软件后清…

【Python笔记-设计模式】抽象工厂模式

一、说明 (一) 解决问题 抽象工厂是一种创建型设计模式&#xff0c;主要解决接口选择的问题。能够创建一系列相关的对象&#xff0c;而无需指定其具体类。 (二) 使用场景 系统中有多于一个的产品族&#xff0c;且这些产品族类的产品需实现同样的接口。 例如&#xff1a;有…

【Transformer】Attention Is All You Need

Abstract 主要的序列转导模型是基于复杂的循环或卷积神经网络&#xff0c;包括一个编码器和一个解码器。表现最好的模型还通过注意机制连接编码器和解码器。我们提出了一个新的简单的网络架构&#xff0c;变压器&#xff0c;完全基于注意力机制&#xff0c;完全摒弃递归和卷积…

JavaEE UDP协议

JavaEE UDP协议 在之前的文章中有对UDP协议套接字的使用进行讲解&#xff0c;本文主要对UDP协议进行一些理论补充。 文章目录 JavaEE UDP协议1. 概念2. UDP协议格式2.1 数据报长度2.2 校验和/检验和2.2.1 CRC校验2.2.2 MD5算法 1. 概念 UDP&#xff0c;即User Datagram Proto…

国标GB/T 28181详解:GB/T28181设备控制流程

目 录 一、基本要求 二、设备控制的功能项目 &#xff08;一&#xff09;设备控制支持的功能项目 &#xff08;二&#xff09;设备配置支持的功能项目 三、命令流程 &#xff08;一&#xff09;无应答命令流程 1、流程图 2、流程描述 &#xff08;二…

代码随想录算法训练营DAY7 | 哈希表(2)

一、LeetCode 454 四数相加II 题目链接&#xff1a;454.四数相加IIhttps://leetcode.cn/problems/4sum-ii/description/ 思路&#xff1a;建立HashMap&#xff0c;Key存储nums1、nums2数对之和&#xff0c;Value存储数对和出现次数&#xff0c;再遍历nums3、nums4数对确定答案…

动态住宅IP可以用来注册亚马逊电商吗?

注册亚马逊店铺可以用动态IP&#xff0c;只要是独立且干净的网线就没问题&#xff0c;亚马逊规则要求一个IP地址只能出现一个亚马逊店铺&#xff0c;若使用不当会导致关联账户。所以现在非常多人使用指纹浏览器搭配代理IP 固定ip可以给我们的账户带来更多的安全&#xff0c;要知…

如何使用docker快速安装Plik并实现固定公网地址远程访问

文章目录 推荐1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点…

矩阵键盘的使用

在定义局部变量时&#xff0c;一定要给该变量赋初值。在这个程序中&#xff0c;给按键按下的返回值变量 KeyNum 赋值为 20 。 矩阵键盘线行扫描法的学习链接&#xff1a;https://www.bilibili.com/video/BV1dv411z7Gd/?spm_id_from333.999.0.0&vd_sourceb91967c499b23106…