当前位置: 首页 > news >正文

第十三届蓝桥杯C++B组省赛 I 题——李白打酒加强版 (AC)

目录

  • 1.李白打酒加强版
    • 1.题目描述
    • 2.输入格式
    • 3.输出格式
    • 4.样例说明
    • 5.数据规模
    • 6.原题链接
  • 2.解题思路
  • 3.Ac_code

1.李白打酒加强版

1.题目描述

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

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

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

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

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

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

2.输入格式

5 10

3.输出格式

14

4.样例说明

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

010101101000000

010110010010000

011000110010000

100010110010000

011001000110000

100011000110000

100100010110000

010110100000100

011001001000100

100011001000100

100100011000100

011010000010100

100100100010100

101000001010100

5.数据规模

1 ≤ N , M ≤ 100 1≤N,M≤100 1N,M100

6.原题链接

李白打酒加强版

2.解题思路

比较明显是一道状态机dp的题目,如何定义好状态可以帮助我们更好地初始化和转移以及求解答案,根据题目范围最大为100,比较明显暗示我们做法是一个 O ( n 3 ) O(n^3) O(n3)dpdp状态也应该是三维的。定义状态 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k] 为已经遇到 i i i 次店, j j j次花,还剩 k k k 斗酒的方案数。状态初始化明显是f[0][0][2]=1

对于酒的上限数量,我们应该想好范围,因为花最多只有 m m m 朵,意味着我们最多只能喝 m m m 壶酒,对于 k k k 超过 m m m 的状态都是无效状态我们无需关心。所以剩余酒的上限也就是 k k k 应该也定为 m m m

考虑进行状态转移,对于状态 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k],假设最后一次遇到的是店,那么此时需要保证 i i i 大于0,并且 k k k 是偶数,因为遇到店剩余酒翻倍, k k k 一定不可能为奇数,那么可以得到转移方程
f [ i ] [ j ] [ k ] = ( f [ i ] [ j ] [ k ] + f [ i − 1 ] [ j ] [ k / 2 ] ) % m o d f[i][j][k] = (f[i][j][k] + f[i - 1][j][k / 2]) \% mod f[i][j][k]=(f[i][j][k]+f[i1][j][k/2])%mod

假设最后一次遇到的是花,那么此时只需要保证 j j j 大于 0即可,我们可以获得转移方程 f [ i ] [ j ] [ k ] = ( f [ i ] [ j ] [ k ] + f [ i ] [ j − 1 ] [ k + 1 ] ) % m o d f[i][j][k] = (f[i][j][k] + f[i][j - 1][k + 1]) \% mod f[i][j][k]=(f[i][j][k]+f[i][j1][k+1])%mod

我们还得考虑答案输出什么,题目要求最后一次遇到的必须是花,那么我们直接输出 f [ n ] [ m ] [ 0 ] f[n][m][0] f[n][m][0] 肯定是错误的答案。 因为这并不能保证最后一次遇到的是花,因为最后是0壶酒,那么在遇到最后一朵花时应该还剩1壶酒,所以我们可以输出 f [ n ] [ m − 1 ] [ 1 ] f[n][m-1][1] f[n][m1][1] 作为答案。

3.Ac_code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 110;


int n, m;
//已经遇到i次店,j次花,还剩k斗酒的方案数
LL f[N][N][N];
void solve()
{
    cin >> n >> m;
    f[0][0][2] = 1;
    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= m; ++j) {
            for (int k = 0; k <= m; ++k) {
                //最后一次遇到店
                if (i && k % 2 == 0) f[i][j][k] = (f[i][j][k] + f[i - 1][j][k / 2]) % mod;
                //最后一次遇到花
                if (j) f[i][j][k] = (f[i][j][k] + f[i][j - 1][k + 1]) % mod;
            }
        }
    }
    cout << f[n][m - 1][1] << '\n';
}
int main()
{
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    while (t--)
    {
        solve();
    }
    return 0;
}

相关文章:

  • 常见的probe set和gallery set究竟是什么
  • 【微机接口】中断系统:中断的应用
  • Spring MVC入口Servlet原理简介说明(HttpServletBean,FrameworkServlet,DispatcherServlet)
  • 【附源码】Python计算机毕业设计社区卫生预约挂号系统
  • 【C++】顺序表,链表,栈的练习(千万要会做)每日小细节007
  • k8s编程operator——client-go基础部分
  • MySQL纯代码复习
  • 零基础入门学习Web开发:HTML篇(一)
  • 【云原生】docker 搭建ElasticSearch7
  • ubuntu安装openresty
  • 前端爱心代码跟个风
  • 【数据结构】C语言实现顺序栈 OJ题 —— 有效的括号
  • Hive笔记
  • 趣味益智小游戏 三子棋+五子棋 优化版(可任意选择棋盘大小)
  • MySQL : 彻底搞懂一条SQL的执行过程
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java精华积累:初学者都应该搞懂的问题
  • k个最大的数及变种小结
  • Logstash 参考指南(目录)
  • python_bomb----数据类型总结
  • Python进阶细节
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue-router 实现分析
  • 阿里研究院入选中国企业智库系统影响力榜
  • 工作手记之html2canvas使用概述
  • 前端技术周刊 2019-01-14:客户端存储
  • 深度学习入门:10门免费线上课程推荐
  • 深入 Nginx 之配置篇
  • 阿里云移动端播放器高级功能介绍
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • (done) 两个矩阵 “相似” 是什么意思?
  • (javascript)再说document.body.scrollTop的使用问题
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (第二周)效能测试
  • (转)C#调用WebService 基础
  • .net core 6 redis操作类
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Micro Framework初体验(二)
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .Net的DataSet直接与SQL2005交互
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [AAuto]给百宝箱增加娱乐功能
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [CSS]中子元素在父元素中居中
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
  • [JavaWeb学习] Spring Ioc和DI概念思想
  • [LeetCode]—Implement strStr() 寻找子串匹配第一个位置 (KMP)