题目描述
你有四个正整数 ,并准备用它们玩一个简单的小游戏。
在一轮游戏操作中,你可以选择将 减去 ,或是将 减去 。游戏将会进行多轮操作,直到当 时游戏结束。 你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作序列不同,当且仅当游戏操作轮数不同,或是某 一轮游戏操作中,一种操作序列选择将 减去 ,而另一种操作序列选择将 减去 。如果 ,也认为将 减去 与将 减去 是不同的操作。 由于答案可能很大,你只需要求出答案对 取模的结果。
输入格式
一行四个正整数 。保证 。
输出格式
一行一个整数,表示不同的游戏操作序列数量对 取模的结果。
样例输入#1
1 1 1 1
样例输出#1
1
样例输入#2
114 51 4 1
样例输出#2
176
样例输入#3
114514 191 9 810
样例输出#3
384178446
思路
因为是有很多分支,为了减少时间复杂度,我们优先选用动态规划,当然也可以用递推,转移方程应该不用多说了吧, 加上 的和再去mod 。
参考代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;const int N = 2e5 + 5;
const int mod = 1e9 + 7;int dp[N];int main()
{/*ios::sync_with_stdio(0);cin.tie(0);*/int n, a, b, c;cin >> n >> a >> b >> c;for(int i = 0; i <= n; i++){if(i <= c)dp[i] = 1;elsedp[i] = (dp[max(0, i - a)] + dp[max(0, i - b)]) % mod; }cout << dp[n];return 0;
}
制作不易,喜欢的话点个关注+赞+收藏,感谢你们的支持!