首页 > 其他分享 >[蓝桥杯 2022 省 B] 李白打酒加强版(三维动态规划)

[蓝桥杯 2022 省 B] 李白打酒加强版(三维动态规划)

时间:2024-04-06 22:29:52浏览次数:20  
标签:状态 加强版 遇到 int 蓝桥 2022 100 include dp

        通过题目描述,我们可以知道这道题目涉及到某种状态时候的方案数,因此我们可以用动态规划来解决问题,并且我们需要注意到酒的状态,因此我们可以用三维数组来存储状态,我们知道N,M最大不会超过100,并且如果酒超过了100斗,即使遇到100朵花也无法喝完,因此只需要定义大小都为100的三维数组即可,并且枚举三种状态,分别是店家,遇到的花以及酒的斗数都进行枚举,根据状态转移方程求得每个状态的方案数量,并且初始化动态数组dp[0][0][2] = 1;因为最后遇到的肯定是花,因此我们只需要输出倒数第二个状态,也就是dp[n][m - 1][1]即可

上代码

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1e2 + 10, mod = 1e9 + 7;

int dp[N][N][N];//dp[i][j][k]表示遇到i个店,j朵花,剩下k斗酒的方案
//当dp[i][j - 1][1]的时候就是答案,因为最后一次肯定是遇到花,并且正好喝完
//需要注意的是,最多遇到的花是100朵此时如果酒多于100斗就相当于答案无效,因为喝不完 
int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n, m; cin >> n >> m;
	dp[0][0][2] = 1;//初始化动态数组 
	for(int i = 0; i <= n; i++){
		for(int j = 0; j <= m; j++){
			for(int k = 0; k <= 100; k++){
				//因为上一次从店家出来,因此此时k为偶数,并且i >= 1才可以进行 
				if(k % 2 == 0 && i) dp[i][j][k] = (dp[i - 1][j][k / 2] + dp[i][j][k]) % mod; 
				//上一次遇到了花,因此上一次的状态是k + 1 
				if(j) dp[i][j][k] = (dp[i][j - 1][k + 1] + dp[i][j][k]) % mod;
			} 
		}
	}
	
	cout << dp[n][m - 1][1] << endl;//最后只需要输出dp[n][m][1]的方案即可 
	
	return 0;
} 

标签:状态,加强版,遇到,int,蓝桥,2022,100,include,dp
From: https://blog.csdn.net/2302_81473103/article/details/137372894

相关文章

  • 蓝桥杯 试题 算法训练 拿金币
    问题描述有一个NxN的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。输入格式第一行输入一个正整数n。以下n行描述该方格。金币数保......
  • python蓝桥题库2141-山
    见题目我最近买了他们官方的程序设计竞赛的书,一本紫色的,在引子部分这部分出现了这道题,最开始看代码的时候没看懂,我现在来逐层分析,你需要有一定基础来看这篇文章,还要就是我的见解偶数情况第一行先设置了个ans的计数变量接下来range循环20-20223(不对啊?这和题目要求的循环......
  • 蓝桥杯2023年A组-试题B-有奖问答
    0.题目小蓝正在参与一个现场问答的节目。活动中一共有30道题目,每题只有答对和答错两种情况,每答对一题得10分,答错一题分数归零。小蓝可以在任意时刻结束答题并获得目前分数对应的奖项,之后不能再答任何题目。最高奖项需要100分,所以到达100分时小蓝会直接停止答题。已知......
  • 第二十五周代码(蓝桥杯查缺补漏)
    2024/03/31    周日填充题目链接【参考代码】想用暴力,没过//枚举,未出结果QAQ#include <bits/stdc++.h>using namespace std;string s00 = "00";string s11 = "11";int ans = 0;//m个问号,子串有2^m种,使用dfs//初步思路:分割子串,直到只有两......
  • 蓝桥杯2023年A组-试题A-幸运数
    0.题目1.题解1.1暴力枚举思路这是一个填空题,所以可以直接暴力枚举注意:1.要是想要求位数:使用log10(abs(num))+12.%求余两边都必须是整数,pow(10,halfDigits);的返回值是double,这里必须转换代码#include<iostream>#include<cmath>boolisLuckyNumber(intn......
  • LG_P8728 [蓝桥杯 2020 国 B] 填空问题 题解
    蓝桥杯2020国BP8728题解A题直接写Python暴力一下。Output:563故答案为\(563\)。B题直接写Python暴力一下(欸怎么又来了)。总之就是写一个DFS,枚举每一个向外走,步数\(x\)满足\(x\le2020\)的点就好啦!Output:20312088故答案为\(20312088\)。C题直......
  • 蓝桥杯:七步诗 ← bfs
    【题目来源】https://www.lanqiao.cn/problems/3447/learning/【题目描述】煮豆燃豆苴,豆在釜中泣。本是同根生,相煎何太急?---曹植所以,这道题目关乎豆子!话说赤壁之战结束后,曹操的船舰被刘备烧了,引领军队从华容道撤退,路上遇到了泥泞,道路不通畅,又刮起了大风,没办法,只好让羸弱的......
  • 蓝桥杯 试题 基础练习 Fibonacci数列
    问题描述Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。输入格式输入包含一个整数n。输出格式输出一行,包含一个整数,表示Fn除以10007的余数。说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要......
  • 蓝桥杯备考随手记: Scanner 类中常用方法
    Scanner类是Java中用于从标准输入、文件或其他输入流中读取数据的类。它提供了一系列方法来读取不同类型的数据,例如整数、浮点数、字符串等。在Java中,Scanner类位于java.util包中,使用时需要先导入该包。使用Scanner类需要先创建一个Scanner对象,并将要读取的输入流传递给它的......
  • 蓝桥杯_省_21B_E_路径(c++)
    题目描述小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。小蓝的图由2021个结点组成,依次编号1至2021。对于两个不同的结点a,b,如果a和b的差的绝对值大于21,则两个结点之间没有边相连;如果a和b的差的绝对值小于等于21,则两个点之间......