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的组合之和。
1 const int mod=1e9+7; 2 class Solution { 3 public: 4 int dp[5010][10]; 5 int dieSimulator(int n, vector<int>& rollMax) { 6 for(int i=1;i<=n;i++){ 7 for(int j=1;j<=6;j++){ 8 for(int p=1;p<=min(i,rollMax[j-1]);p++){ 9 if(p==i){dp[i][j]=(dp[i][j]+1)%mod; continue;} 10 for(int q=1;q<=6;q++){ 11 if(q==j)continue; 12 dp[i][j]=(dp[i][j]+dp[i-p][q])%mod; 13 } 14 } 15 } 16 } 17 int ans=0; 18 for(int i=1;i<=6;i++)ans=(ans+dp[n][i])%mod; 19 return ans; 20 } 21 };