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 };
View Code
posted @ 2019-10-16 15:17  ljy3268  阅读(320)  评论(0编辑  收藏  举报