题目描述
A、B两个人玩抢7游戏,游戏规则为:
A先报一个起始数字 X(10 ≤ 起始数字 ≤ 10000),B报下一个数字 Y (X - Y < 3),A再报一个数字 Z(Y - Z < 3),以此类推,直到其中一个抢到7,抢到7即为胜者;
在B赢得比赛的情况下,一共有多少种组合?
输入描述
起始数字 M
- 10 ≤ M ≤ 10000
如:
100
输出描述
B能赢得比赛的组合次数
用例1
输入 | 10 |
输出 | 1 |
说明 | 无 |
考点
动态规划
解题思路
本题使用动态规划解题比较简单。假设B喊m,则在B之前A有可能喊m+1或m+2。因此,用dpb[i]表示B喊i时的组合数,dpa[i]表示A喊i时的组合数,可以得到动态转移方程:dpb[i]=dpa[i+1]+dpa[i+2],同理:dpa[i]=dpb[i+1]+dpb[i+2]。因为m是A喊出,因此dpa[m]=1,dpa[m+1]=0。dpb[m-1]=dpa[m]+dpa[m+1]。同时,dpa[m-1]=dpb[m]+dpb[m+1],数字m-1对A来说是叫不到的,因此dpa[m-1]=0,可得dpb[m]=0,dpb[m+1]=0.
最后,只需输出dpb[7]的值即可。
代码
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int m;
cin>>m;
vector<int> dpa(m+2, 0);
vector<int> dpb(m+2, 0);
dpa[m]=1;
for(int i=m-1;i>=7;i--) {
dpa[i]=dpb[i+1]+dpb[i+2];
dpb[i]=dpa[i+1]+dpa[i&#