Skip to content

feat: add solutions to lc problem: No.1155 #1855

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 152 additions & 4 deletions solution/1100-1199/1155.Number of Dice Rolls With Target Sum/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,12 @@ $$

其中 $h$ 表示第 $i$ 个骰子的点数。

最终的答案即为 $f[n][target]$。
初始时 $f[0][0] = 1$,最终的答案即为 $f[n][target]$。

时间复杂度 $O(n \times k \times target)$,空间复杂度 $O(n \times target)$。

我们注意到,状态 $f[i][j]$ 只和 $f[i-1][]$ 有关,因此我们可以使用滚动数组的方式,将空间复杂度优化到 $O(target)$。

<!-- tabs:start -->

### **Python3**
Expand All @@ -85,6 +87,20 @@ class Solution:
return f[n][target]
```

```python
class Solution:
def numRollsToTarget(self, n: int, k: int, target: int) -> int:
f = [1] + [0] * target
mod = 10**9 + 7
for i in range(1, n + 1):
g = [0] * (target + 1)
for j in range(1, min(i * k, target) + 1):
for h in range(1, min(j, k) + 1):
g[j] = (g[j] + f[j - h]) % mod
f = g
return f[target]
```

### **Java**

<!-- 这里可写当前语言的特殊实现逻辑 -->
Expand All @@ -107,6 +123,26 @@ class Solution {
}
```

```java
class Solution {
public int numRollsToTarget(int n, int k, int target) {
final int mod = (int) 1e9 + 7;
int[] f = new int[target + 1];
f[0] = 1;
for (int i = 1; i <= n; ++i) {
int[] g = new int[target + 1];
for (int j = 1; j <= Math.min(target, i * k); ++j) {
for (int h = 1; h <= Math.min(j, k); ++h) {
g[j] = (g[j] + f[j - h]) % mod;
}
}
f = g;
}
return f[target];
}
}
```

### **C++**

```cpp
Expand All @@ -129,6 +165,27 @@ public:
};
```

```cpp
class Solution {
public:
int numRollsToTarget(int n, int k, int target) {
const int mod = 1e9 + 7;
vector<int> f(target + 1);
f[0] = 1;
for (int i = 1; i <= n; ++i) {
vector<int> g(target + 1);
for (int j = 1; j <= min(target, i * k); ++j) {
for (int h = 1; h <= min(j, k); ++h) {
g[j] = (g[j] + f[j - h]) % mod;
}
}
f = move(g);
}
return f[target];
}
};
```

### **Go**

```go
Expand Down Expand Up @@ -157,13 +214,36 @@ func min(a, b int) int {
}
```

```go
func numRollsToTarget(n int, k int, target int) int {
const mod int = 1e9 + 7
f := make([]int, target+1)
f[0] = 1
for i := 1; i <= n; i++ {
g := make([]int, target+1)
for j := 1; j <= min(target, i*k); j++ {
for h := 1; h <= min(j, k); h++ {
g[j] = (g[j] + f[j-h]) % mod
}
}
f = g
}
return f[target]
}

func min(a, b int) int {
if a < b {
return a
}
return b
}
```

### **TypeScript**

```ts
function numRollsToTarget(n: number, k: number, target: number): number {
const f = Array(n + 1)
.fill(0)
.map(() => Array(target + 1).fill(0));
const f = Array.from({ length: n + 1 }, () => Array(target + 1).fill(0));
f[0][0] = 1;
const mod = 1e9 + 7;
for (let i = 1; i <= n; ++i) {
Expand All @@ -177,6 +257,74 @@ function numRollsToTarget(n: number, k: number, target: number): number {
}
```

```ts
function numRollsToTarget(n: number, k: number, target: number): number {
const f = Array(target + 1).fill(0);
f[0] = 1;
const mod = 1e9 + 7;
for (let i = 1; i <= n; ++i) {
const g = Array(target + 1).fill(0);
for (let j = 1; j <= Math.min(i * k, target); ++j) {
for (let h = 1; h <= Math.min(j, k); ++h) {
g[j] = (g[j] + f[j - h]) % mod;
}
}
f.splice(0, target + 1, ...g);
}
return f[target];
}
```

### **Rust**

```rust
impl Solution {
pub fn num_rolls_to_target(n: i32, k: i32, target: i32) -> i32 {
let _mod = 1_000_000_007;
let n = n as usize;
let k = k as usize;
let target = target as usize;
let mut f = vec![vec![0; target + 1]; n + 1];
f[0][0] = 1;

for i in 1..=n {
for j in 1..=target.min(i * k) {
for h in 1..=j.min(k) {
f[i][j] = (f[i][j] + f[i - 1][j - h]) % _mod;
}
}
}

f[n][target]
}
}
```

```rust
impl Solution {
pub fn num_rolls_to_target(n: i32, k: i32, target: i32) -> i32 {
let _mod = 1_000_000_007;
let n = n as usize;
let k = k as usize;
let target = target as usize;
let mut f = vec![0; target + 1];
f[0] = 1;

for i in 1..=n {
let mut g = vec![0; target + 1];
for j in 1..=target {
for h in 1..=j.min(k) {
g[j] = (g[j] + f[j - h]) % _mod;
}
}
f = g;
}

f[target]
}
}
```

### **...**

```
Expand Down
Loading