【Leetcode-算法】1155. 掷骰子的N种方法(C++)

1155. 掷骰子的N种方法


这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, ..., f。
我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。
如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所有的组合情况总共有 f^d 种),模 10^9 + 7 后返回。

示例 1:
输入:d = 1, f = 6, target = 3
输出:1

示例 2:
输入:d = 2, f = 6, target = 7
输出:6

示例 3:
输入:d = 2, f = 5, target = 10
输出:1

示例 4:
输入:d = 1, f = 2, target = 3
输出:0

示例 5:
输入:d = 30, f = 30, target = 500
输出:222616187
 

提示:
1 <= d, f <= 30
1 <= target <= 1000

思路:

    显然是个dp题,列转移方程:

【Leetcode-算法】1155. 掷骰子的N种方法(C++)_第1张图片

    ans[d,target]即为所求答案。

    注意记得取模!一开始我写的ans[i][j]+=ans[i-1][j-k]%mod然后爆int了…憨憨操作,搞错优先级了。

AC代码:

class Solution {
public:
    int numRollsToTarget(int d, int f, int target) {
        int mmod=1e9+7,ans[32][1005];
        memset(ans,0,sizeof(ans));
        for(int i=1;i<=f;i++) ans[1][i]=1;
        for(int i=2;i<=d;i++)
            for(int j=1;j<=target;j++)
                for(int k=1;k<=f&&j>k;k++)
                    ans[i][j]=(ans[i][j]+ans[i-1][j-k])%mmod;
        return ans[d][target];
    }
};

 

你可能感兴趣的:(Leetcode,DP)