leetcode 1223. 掷骰子模拟
题目:
有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。
不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i
的次数不能超过 rollMax[i]
(i
从 1 开始编号)。
现在,给你一个整数数组 rollMax
和一个整数 n
,请你来计算掷 n
次骰子可得到的不同点数序列的数量。
假如两个序列中至少存在一个元素不同,就认为这两个序列是不同的。由于答案可能很大,所以请返回 模 10^9 + 7
之后的结果。
思路:
动态规划,设置dp[n][i]表示长度为n,且最后结尾的数为i的组合数量。
dp[n][i]等于所有长度为n且第(n-1,n-2...,n-rollmax[i])位不为i的组合之和。
代码:
const int mod=1e9+7;
class Solution {
public:
int dp[5010][10];
int dieSimulator(int n, vector<int>& rollMax) {
for(int i=1;i<=n;i++){
for(int j=1;j<=6;j++){
for(int p=1;p<=min(i,rollMax[j-1]);p++){
if(p==i){dp[i][j]=(dp[i][j]+1)%mod; continue;}
for(int q=1;q<=6;q++){
if(q==j)continue;
dp[i][j]=(dp[i][j]+dp[i-p][q])%mod;
}
}
}
}
int ans=0;
for(int i=1;i<=6;i++)ans=(ans+dp[n][i])%mod;
return ans;
}
};