讨论/题目交流/🏆 第 158 场力扣周赛/
🏆 第 158 场力扣周赛

欢迎小伙伴们在这里交流分享你的参赛心得以及体验。【前往竞赛

image.png

分割平衡字符串
可以攻击国王的皇后
掷骰子模拟
最大相等频率

展开讨论
力扣 (LeetCode)发起于 2019-10-13
最近编辑于 2019-10-14

第三题,扔色子.
我的思路很简单,用一个三维数组表示的话。v[k][i][j]表示第k轮扔出i点的骰子,并且这个点数已经连续出现j次时的序列的个数。
如果下一轮的点数和这一轮最后的点数不同的时候:v[k+1][c][1] += v[k][i][j]
如果下一轮的点数和这一轮最后的点数相同并且依然不超过这个点最大的可连续限制的时候:v[k+1][i][j+1] += v[k][i][j]
当然,别忘记取模。
而且由于强迫症,不喜欢开三维的数组,所以用了两维的数组只记录一轮的结果。

class Solution {
public:
    int dieSimulator(int n, vector<int>& rollMax) {
        vector<vector<int> > ve(6, vector<int>(16, 0));
        int mo = 1000000007;
        for(int i=0; i<6; i++)
        {
            ve[i][1] = 1;
        }
        for(int k=2; k<=n; k++)
        {
            vector<vector<int> > t(6, vector<int>(16, 0));
            for(int i=0; i<6; i++)
            {
                for(int j=1; j<ve[i].size()&&j<k; j++)
                {
                    for(int c=0; c<6; c++)
                    {
                        if(c!=i)
                            t[c][1] = (t[c][1] + ve[i][j])%mo;
                        else if(j<rollMax[i])
                            t[c][j+1] = (t[c][j+1] + ve[i][j])%mo;
                    }
                }
            }
            ve.clear();
            ve = t;
        }
        int res = 0;
        for(int i=0; i<6; i++)
        {
            for(int j=0; j<ve[i].size(); j++)
            {
                res = (res + ve[i][j])%mo;
            }
        }
        return res;
    }
};
1
展开全部 14 讨论