Skip to content

Commit 3bb2d93

Browse files
committed
feat: add solutions to lc problem: No.1155
No.1155.Number of Dice Rolls With Target Sum
1 parent 13f5964 commit 3bb2d93

File tree

6 files changed

+225
-15
lines changed

6 files changed

+225
-15
lines changed

solution/1100-1199/1155.Number of Dice Rolls With Target Sum/README.md

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,110 @@
5252

5353
<!-- 这里可写通用的实现逻辑 -->
5454

55+
**方法一:动态规划**
56+
57+
我们定义 $f[i][j]$ 表示使用 $i$ 个骰子,和为 $j$ 的方案数。那么我们可以得到状态转移方程:
58+
59+
$$
60+
f[i][j] = \sum_{h=1}^{\min(j, k)} f[i-1][j-h]
61+
$$
62+
63+
其中 $h$ 表示第 $i$ 个骰子的点数。
64+
65+
最终的答案即为 $f[n][target]$。
66+
67+
时间复杂度 $O(n \times k \times target)$,空间复杂度 $O(n \times target)$。
68+
5569
<!-- tabs:start -->
5670

5771
### **Python3**
5872

5973
<!-- 这里可写当前语言的特殊实现逻辑 -->
6074

6175
```python
62-
76+
class Solution:
77+
def numRollsToTarget(self, n: int, k: int, target: int) -> int:
78+
f = [[0] * (target + 1) for _ in range(n + 1)]
79+
f[0][0] = 1
80+
mod = 10**9 + 7
81+
for i in range(1, n + 1):
82+
for j in range(1, min(i * k, target) + 1):
83+
for h in range(1, min(j, k) + 1):
84+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % mod
85+
return f[n][target]
6386
```
6487

6588
### **Java**
6689

6790
<!-- 这里可写当前语言的特殊实现逻辑 -->
6891

6992
```java
93+
class Solution {
94+
private static final int MOD = (int) 1e9 + 7;
95+
96+
public int numRollsToTarget(int n, int k, int target) {
97+
int[][] f = new int[n + 1][target + 1];
98+
f[0][0] = 1;
99+
for (int i = 1; i <= n; ++i) {
100+
for (int j = 1; j <= Math.min(target, i * k); ++j) {
101+
for (int h = 1; h <= Math.min(j, k); ++h) {
102+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % MOD;
103+
}
104+
}
105+
}
106+
return f[n][target];
107+
}
108+
}
109+
```
110+
111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
int numRollsToTarget(int n, int k, int target) {
117+
const int mod = 1e9 + 7;
118+
int f[n + 1][target + 1];
119+
memset(f, 0, sizeof f);
120+
f[0][0] = 1;
121+
for (int i = 1; i <= n; ++i) {
122+
for (int j = 1; j <= min(target, i * k); ++j) {
123+
for (int h = 1; h <= min(j, k); ++h) {
124+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % mod;
125+
}
126+
}
127+
}
128+
return f[n][target];
129+
}
130+
};
131+
```
70132
133+
### **Go**
134+
135+
```go
136+
func numRollsToTarget(n int, k int, target int) int {
137+
const mod int = 1e9 + 7
138+
f := make([][]int, n+1)
139+
for i := range f {
140+
f[i] = make([]int, target+1)
141+
}
142+
f[0][0] = 1
143+
for i := 1; i <= n; i++ {
144+
for j := 1; j <= min(target, i*k); j++ {
145+
for h := 1; h <= min(j, k); h++ {
146+
f[i][j] = (f[i][j] + f[i-1][j-h]) % mod
147+
}
148+
}
149+
}
150+
return f[n][target]
151+
}
152+
153+
func min(a, b int) int {
154+
if a < b {
155+
return a
156+
}
157+
return b
158+
}
71159
```
72160

73161
### **...**

solution/1100-1199/1155.Number of Dice Rolls With Target Sum/README_EN.md

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,87 @@ There are 6 ways to get a sum of 7: 1+6, 2+5, 3+4, 4+3, 5+2, 6+1.
5050
### **Python3**
5151

5252
```python
53-
53+
class Solution:
54+
def numRollsToTarget(self, n: int, k: int, target: int) -> int:
55+
f = [[0] * (target + 1) for _ in range(n + 1)]
56+
f[0][0] = 1
57+
mod = 10**9 + 7
58+
for i in range(1, n + 1):
59+
for j in range(1, min(i * k, target) + 1):
60+
for h in range(1, min(j, k) + 1):
61+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % mod
62+
return f[n][target]
5463
```
5564

5665
### **Java**
5766

5867
```java
68+
class Solution {
69+
private static final int MOD = (int) 1e9 + 7;
70+
71+
public int numRollsToTarget(int n, int k, int target) {
72+
int[][] f = new int[n + 1][target + 1];
73+
f[0][0] = 1;
74+
for (int i = 1; i <= n; ++i) {
75+
for (int j = 1; j <= Math.min(target, i * k); ++j) {
76+
for (int h = 1; h <= Math.min(j, k); ++h) {
77+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % MOD;
78+
}
79+
}
80+
}
81+
return f[n][target];
82+
}
83+
}
84+
```
85+
86+
### **C++**
87+
88+
```cpp
89+
class Solution {
90+
public:
91+
int numRollsToTarget(int n, int k, int target) {
92+
const int mod = 1e9 + 7;
93+
int f[n + 1][target + 1];
94+
memset(f, 0, sizeof f);
95+
f[0][0] = 1;
96+
for (int i = 1; i <= n; ++i) {
97+
for (int j = 1; j <= min(target, i * k); ++j) {
98+
for (int h = 1; h <= min(j, k); ++h) {
99+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % mod;
100+
}
101+
}
102+
}
103+
return f[n][target];
104+
}
105+
};
106+
```
59107
108+
### **Go**
109+
110+
```go
111+
func numRollsToTarget(n int, k int, target int) int {
112+
const mod int = 1e9 + 7
113+
f := make([][]int, n+1)
114+
for i := range f {
115+
f[i] = make([]int, target+1)
116+
}
117+
f[0][0] = 1
118+
for i := 1; i <= n; i++ {
119+
for j := 1; j <= min(target, i*k); j++ {
120+
for h := 1; h <= min(j, k); h++ {
121+
f[i][j] = (f[i][j] + f[i-1][j-h]) % mod
122+
}
123+
}
124+
}
125+
return f[n][target]
126+
}
127+
128+
func min(a, b int) int {
129+
if a < b {
130+
return a
131+
}
132+
return b
133+
}
60134
```
61135

62136
### **...**
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
int numRollsToTarget(int n, int k, int target) {
4+
const int mod = 1e9 + 7;
5+
int f[n + 1][target + 1];
6+
memset(f, 0, sizeof f);
7+
f[0][0] = 1;
8+
for (int i = 1; i <= n; ++i) {
9+
for (int j = 1; j <= min(target, i * k); ++j) {
10+
for (int h = 1; h <= min(j, k); ++h) {
11+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % mod;
12+
}
13+
}
14+
}
15+
return f[n][target];
16+
}
17+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func numRollsToTarget(n int, k int, target int) int {
2+
const mod int = 1e9 + 7
3+
f := make([][]int, n+1)
4+
for i := range f {
5+
f[i] = make([]int, target+1)
6+
}
7+
f[0][0] = 1
8+
for i := 1; i <= n; i++ {
9+
for j := 1; j <= min(target, i*k); j++ {
10+
for h := 1; h <= min(j, k); h++ {
11+
f[i][j] = (f[i][j] + f[i-1][j-h]) % mod
12+
}
13+
}
14+
}
15+
return f[n][target]
16+
}
17+
18+
func min(a, b int) int {
19+
if a < b {
20+
return a
21+
}
22+
return b
23+
}
Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
class Solution {
2-
public int numRollsToTarget(int d, int f, int target) {
3-
int[][] dp = new int[d + 1][target + 1];
4-
dp[0][0] = 1;
5-
for (int i = 1; i <= d; ++i) {
6-
for (int j = 1; j <= target; ++j) {
7-
// j 大于当前所有骰子的最大和,不可能满足条件
8-
if (j > i * f) {
9-
break;
10-
}
11-
for (int k = 1; k <= f && k <= j; ++k) {
12-
dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % 1000000007;
2+
private static final int MOD = (int) 1e9 + 7;
3+
4+
public int numRollsToTarget(int n, int k, int target) {
5+
int[][] f = new int[n + 1][target + 1];
6+
f[0][0] = 1;
7+
for (int i = 1; i <= n; ++i) {
8+
for (int j = 1; j <= Math.min(target, i * k); ++j) {
9+
for (int h = 1; h <= Math.min(j, k); ++h) {
10+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % MOD;
1311
}
1412
}
1513
}
16-
return dp[d][target];
14+
return f[n][target];
1715
}
18-
}
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def numRollsToTarget(self, n: int, k: int, target: int) -> int:
3+
f = [[0] * (target + 1) for _ in range(n + 1)]
4+
f[0][0] = 1
5+
mod = 10**9 + 7
6+
for i in range(1, n + 1):
7+
for j in range(1, min(i * k, target) + 1):
8+
for h in range(1, min(j, k) + 1):
9+
f[i][j] = (f[i][j] + f[i - 1][j - h]) % mod
10+
return f[n][target]

0 commit comments

Comments
 (0)