首页 > 其他分享 >P8786 李白打酒加强版 题解

P8786 李白打酒加强版 题解

时间:2023-05-17 21:12:42浏览次数:56  
标签:加强版 遇到 int 题解 P8786 显里 斗酒 dp

李白打酒加强版

题目大意

一开始酒显里有 \(2\) 斗酒,每遇到一次店就会把酒显里的酒数量(单位: 斗)乘 \(2\),每遇到一次花就把酒显里的酒喝掉 \(1\) 斗。

这一路上一共遇到店 \(n\) 次,遇到花 \(m\) 次,且最后一次遇到的是花,酒显里没有一斗酒了。

计算这一路上遇到店和花的顺序总共有多少种可能(答案模 \(1e9 + 7\))。

允许 \(0\) 斗酒时遇到店,不允许 \(0\) 斗酒时遇到花。

思路

这题我一眼就看出是一个动态规划题 (因为看了标签)

由于最后一次固定为遇到花,所以可以先把 \(m\) 减去 \(1\)。

  • 状态:dp[i][j][k] 表示来到第 \(i\) 处地点,遇到店 \(j\) 次,酒显里还有 \(k\) 斗酒的方案数。
  • 转移方程:
    • 遇到店:dp[i - 1][j - 1][k / 2] 转移到 dp[i][j][k](需保证 \(j \geqslant 1\) 并且 \(k\) 为偶数)
    • 遇到花:dp[i - 1][j][k + 1] 转移到 dp[i][j][k]
  • 初始状态:dp[0][0][2] = 1
  • 目标状态:dp[n + m][n][1]

很显然,如果直接连续一百次遇到店(酒显里还有酒时),酒显里的酒的斗数就会变得很大。

但是,要想喝最多 \(100\) 斗就能喝完,当酒的斗数在任何时候超过 \(100\) 的情况是不用讨论的,因为喝不完了。

一定要记得取模。

代码

#include <iostream>

using namespace std;

const int mod = 1e9 + 7;

int n, m;
int dp[210][110][110]; // 注意数组大小

int main(){
  cin >> n >> m;
  m--, dp[0][0][2] = 1; // 初始状态
  for (int i = 1; i <= n + m; i++){ // 一共 n + m 处地点
    for (int j = 0; j <= min(n, i); j++){ // 最多只能遇店 n 次,但是也不能超过 i 次
      for (int k = 0; k <= 100; k++){ // 100 以上不用考虑
        dp[i][j][k] = dp[i - 1][j][k + 1]; // 遇到花
        if (k % 2 == 0 && j){ // 满足要求,可以遇到店
          dp[i][j][k] = (dp[i][j][k] + dp[i - 1][j - 1][k / 2]) % mod; // 状态转移方程,记得取模
        }
      }
    }
  }
  cout << dp[n + m][n][1]; // 输出目标状态
  return 0;
}

标签:加强版,遇到,int,题解,P8786,显里,斗酒,dp
From: https://www.cnblogs.com/lw0-blog/p/17410214.html

相关文章

  • YACS 2023年5月月赛 甲组 T1 子集和(六) 题解
    YACS老师说这是道分治,但就不告诉我怎么做,我硬是用线段树卡了过去...特别解气的是把AC图片发了过去(我就是在YACS上的编程课)莫队好了说点正经的,看到是谁谁谁的倍数就能想到DP,状态设计也很水啦!设f[i]为当前考虑到的区间内,子集和%k=i的数量。新加入一个元素时,循环0~......
  • CF1183C Computer Game 题解
    ComputerGame还算水的一道题。题意本题意为题面直接翻译的简化版,可能会比题目翻译要复杂。有\(q\)次询问,每次给出四个数,表示一开始的电亮为\(k\),有\(n\)个回合,不插电玩一个回合则电量会减少\(a\),插电玩一个回合则电量会减少\(b\),电量在任何时刻都必须严格大于\(0\)......
  • Plsql或Navicat连接登陆Oracle时慢、执行语句的时候也特别慢的问题解决方案
    用Plsql或Navicat连接登陆Oracle时,等待时间特别长。经过漫长的等待后,执行语句的时候也特别慢,监听配置没毛病的情况下,大概率是监听日志文件过大导致的。监听日志路径:app\Administrator\diag\tnslsnr\LS--20171012URU\listener\trace\listener.log删除listener.log文件即可。......
  • 交通运输(Wormhole Transportaion) 题解
    传送门交通运输(WormholeTransportaion)题目大意有\(n\)个点和\(m\)个点对,你需要构造一张\(m-1\)条边的无向图,使得\(m\)个点对间最短路之和最小。求最小值及取到最小值的方案数。\(2\len\le2000,2\lenm\le2\times10^7,1\leu_i,v_i\len,u_i\neqv_i\)。......
  • P3919 【模板】可持久化线段树 1(可持久化数组) 题解
    一、题目描述:维护这样的一个长度为$n$的数组,支持以下两种操作$1$:在某个历史版本上修改某一个位置上的值$2$:访问某个历史版本上的某一位置的值每进行一次操作,就会生成一个新的版本(对于操作2,生成的就是一个完全一样的版本)。版本编号即为当前操作......
  • 题解:独占访问2 Exclusive Access 2
    题目链接怎么唯一一篇题解这么抽象,完全看不懂给定一张无向图,求给这张图定向成DAG之后的最长路最短是多少。转化一下变成对DAG进行分层,每一层之间的点没有连边,使得层数尽可能少,那么最后的层数就是答案。那么就求出若干个独立集,让独立集总数尽可能少。这是经典的色数问题,我们......
  • GYM102392 简要题解
    自己下午闲着没事单挑了一下,两小时左右一度rk1,但后继无力了。。。。A.MaxorMin肯定沿着出现过的数操作;然后发现如果a[i]=k,a[j]>k,a[k]<k就会增加一次操作所以维护一下差分序列即可。B.LevelUp两维DP,这个疑似edu出过。要注意的是:需要关于x排个序,不然会漏一些转移。D.......
  • AT_dp_s 题解
    题目传送门第一道数位\(\text{dp}\),检验一下自己懂没懂。特别感谢\(\text{yinhee}\)大佬,他的讲解令我受益匪浅。题目分析\(dp_{pos,res,lim}\)为当前枚举到从高位往低位数第\(pos\)位,数字和取模后的余数为\(res\)时的方案数,其中\(lim\)可以理解为一个布尔值,\(0\)表......
  • abc260_g Scalene Triangle Area 题解
    题目传送门题意给定一个大小为\(n\timesn\)的字符矩阵,每个字符为X或者O。对于一个位于\((x,y)\)的字符o和一个格子\((u,v)\),如果满足以下条件,那么\((u,v)\)就可以被\((x,y)\)控制。\(x\leqslantu\leqslantn\),\(y\leqslantv\leqslantn\)。\((u-x)+\fr......
  • 前端传递参数与后端接收的类属性不一致问题解决办法
    使用@JsonAlias作用是在反序列化的时候可以让Bean的属性接收多个json字段的名称。可以加在字段上或者getter和setter方法上。publicclassUser{ @JsonAlias({"name","user"}) privateStringusername; privateStringpassword; privateIntegerage;}这样子......