cpp
class Solution {
public:
int ans = 0;
int Mod = 1e9 + 7;
int numRollsToTarget(int n, int k, int target) {
return dfs(n, k, target);
}
map<string, int> m;
int dfs(int n, int k, int target) {
if(target == 0 && n == 0) return 1;
if(target < 0 || n == 0) return 0;
// 遍历第index个骰子的第j个面
// 这一步是记忆化搜索的过程,剩下n个骰子,剩下的target肯定有重复搜索的情况
// 比如,剩下一个骰子,前面的结果是 2 3 和 3 2 就是导致 1 1 被重复搜索
// 所以,记录下现在的 n k target 三元组,避免后面再次遇见的时候,重复搜索
string s = to_string(n) + "_" + to_string(k) + "_" + to_string(target);
// cout << s << endl;
if(m.count(s)) {
// cout << s << endl;
return m[s];
}
int res = 0;
for(int i = 1; i <= k; i ++) {
int t = dfs(n - 1, k, target - i);
res = (res + t) % Mod;
}
m[s] = res;
return res;
}
};