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;
    }
};

猜你喜欢

转载自www.cnblogs.com/ljy08163268/p/11685688.html