-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1155.number-of-dice-rolls-with-target-sum.cpp
136 lines (128 loc) · 2.89 KB
/
1155.number-of-dice-rolls-with-target-sum.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// @lcpr-before-debug-begin
// @lcpr-before-debug-end
/*
* @lc app=leetcode.cn id=1155 lang=cpp
* @lcpr version=30102
*
* [1155] 掷骰子等于目标和的方法数
*
* https://leetcode.cn/problems/number-of-dice-rolls-with-target-sum/description/
*
* algorithms
* Medium (60.39%)
* Likes: 241
* Dislikes: 0
* Total Accepted: 35.3K
* Total Submissions: 58.4K
* Testcase Example: '1\n6\n3'
*
* 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。
*
* 给定三个整数 n , k 和 target ,返回可能的方式(从总共 k^n 种方式中)滚动骰子的数量,使正面朝上的数字之和等于 target 。
*
* 答案可能很大,你需要对 10^9 + 7 取模 。
*
*
*
* 示例 1:
*
* 输入:n = 1, k = 6, target = 3
* 输出:1
* 解释:你扔一个有 6 个面的骰子。
* 得到 3 的和只有一种方法。
*
*
* 示例 2:
*
* 输入:n = 2, k = 6, target = 7
* 输出:6
* 解释:你扔两个骰子,每个骰子有 6 个面。
* 得到 7 的和有 6 种方法:1+6 2+5 3+4 4+3 5+2 6+1。
*
*
* 示例 3:
*
* 输入:n = 30, k = 30, target = 500
* 输出:222616187
* 解释:返回的结果必须是对 10^9 + 7 取模。
*
*
*
* 提示:
*
*
* 1 <= n, k <= 30
* 1 <= target <= 1000
*
*
*/
// @lcpr-template-start
using namespace std;
#include <algorithm>
#include <array>
#include <climits>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <numeric>
#include <queue>
#include <stack>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
// @lcpr-template-end
// @lc code=start
class Solution
{
public:
int numRollsToTarget(int n, int k, int target)
{
vector<long long> vi(target + 1);
for (int i = 0; i < n; i++)
{
vector<long long> new_vi(target + 1);
for (int j = 1; j <= k; j++)
{
if (i == 0)
{
if (j < new_vi.size())
{
new_vi[j] = 1;
}
}
else
{
for (int t = 0; t < new_vi.size(); t++)
{
if (t + j < new_vi.size())
{
new_vi[t + j] += vi[t];
new_vi[t + j] %= (1000000007);
}
}
}
}
vi = new_vi;
}
return vi[target];
}
};
// @lc code=end
// @lcpr-div-debug-arg-start
// funName=numRollsToTarget
// paramTypes= ["number","number","number"]
// @lcpr-div-debug-arg-end
/*
// @lcpr case=start
// 1\n6\n3\n
// @lcpr case=end
// @lcpr case=start
// 2\n6\n7\n
// @lcpr case=end
// @lcpr case=start
// 30\n30\n500\n
// @lcpr case=end
*/