Skip to content

Commit 788fbf2

Browse files
committed
feat: add solutions to lc problem: No.1621
No.1621.Number of Sets of K Non-Overlapping Line Segments
1 parent 8a70ed3 commit 788fbf2

File tree

6 files changed

+302
-2
lines changed

6 files changed

+302
-2
lines changed

solution/1600-1699/1621.Number of Sets of K Non-Overlapping Line Segments/README.md

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,142 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
**方法一:动态规划**
67+
68+
记 $f[i][j]$ 表示使用前 $i$ 个点构造了 $j$ 条线段,且最后一条线段的右端点不为 $i$ 的方案数;记 $g[i][j]$ 表示使用了前 $i$ 个点构造了 $j$ 条线段,且最后一条线段的右端点为 $i$ 的方案数。初始时 $f[1][0]=1$。
69+
70+
考虑 $f[i][j]$,由于第 $j$ 条线段的右端点不为 $i$,因此前 $i-1$ 个点构造了 $j$ 条线段,因此有:
71+
72+
$$
73+
f[i][j] = f[i-1][j] + g[i - 1][j]
74+
$$
75+
76+
考虑 $g[i][j]$,第 $j$ 条线段的右端点为 $i$,如果第 $j$ 条线段的长度超过 $1$,则前 $i-1$ 个点构造了 $j$ 条线段,且第 $j$ 条线段的右端点一定覆盖了 $i-1$,因此有:
77+
78+
$$
79+
g[i][j] = g[i - 1][j]
80+
$$
81+
82+
如果第 $j$ 条线段的长度为 $1$,则前 $i-1$ 个点构造了 $j-1$ 条线段,有:
83+
84+
$$
85+
g[i][j] = f[i - 1][j - 1] + g[i - 1][j - 1]
86+
$$
87+
88+
答案为 $f[n][k]+g[n][k]$。
89+
90+
时间复杂度 $O(n\times k)$,空间复杂度 $O(n\times k)$。
91+
6692
<!-- tabs:start -->
6793

6894
### **Python3**
6995

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

7298
```python
73-
99+
class Solution:
100+
def numberOfSets(self, n: int, k: int) -> int:
101+
mod = 10**9 + 7
102+
f = [[0] * (k + 1) for _ in range(n + 1)]
103+
g = [[0] * (k + 1) for _ in range(n + 1)]
104+
f[1][0] = 1
105+
for i in range(2, n + 1):
106+
for j in range(k + 1):
107+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % mod
108+
g[i][j] = g[i - 1][j]
109+
if j:
110+
g[i][j] += f[i - 1][j - 1]
111+
g[i][j] %= mod
112+
g[i][j] += g[i - 1][j - 1]
113+
g[i][j] %= mod
114+
return (f[-1][-1] + g[-1][-1]) % mod
74115
```
75116

76117
### **Java**
77118

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

80121
```java
122+
class Solution {
123+
private static final int MOD = (int) 1e9 + 7;
124+
125+
public int numberOfSets(int n, int k) {
126+
int[][] f = new int[n + 1][k + 1];
127+
int[][] g = new int[n + 1][k + 1];
128+
f[1][0] = 1;
129+
for (int i = 2; i <= n; ++i) {
130+
for (int j = 0; j <= k; ++j) {
131+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % MOD;
132+
g[i][j] = g[i - 1][j];
133+
if (j > 0) {
134+
g[i][j] += f[i - 1][j - 1];
135+
g[i][j] %= MOD;
136+
g[i][j] += g[i - 1][j - 1];
137+
g[i][j] %= MOD;
138+
}
139+
}
140+
}
141+
return (f[n][k] + g[n][k]) % MOD;
142+
}
143+
}
144+
```
145+
146+
### **C++**
147+
148+
```cpp
149+
class Solution {
150+
public:
151+
int f[1010][1010];
152+
int g[1010][1010];
153+
const int mod = 1e9 + 7;
154+
155+
int numberOfSets(int n, int k) {
156+
memset(f, 0, sizeof(f));
157+
memset(g, 0, sizeof(g));
158+
f[1][0] = 1;
159+
for (int i = 2; i <= n; ++i) {
160+
for (int j = 0; j <= k; ++j) {
161+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % mod;
162+
g[i][j] = g[i - 1][j];
163+
if (j > 0) {
164+
g[i][j] += f[i - 1][j - 1];
165+
g[i][j] %= mod;
166+
g[i][j] += g[i - 1][j - 1];
167+
g[i][j] %= mod;
168+
}
169+
}
170+
}
171+
return (f[n][k] + g[n][k]) % mod;
172+
}
173+
};
174+
```
81175

176+
### **Go**
177+
178+
```go
179+
func numberOfSets(n int, k int) int {
180+
f := make([][]int, n+1)
181+
g := make([][]int, n+1)
182+
for i := range f {
183+
f[i] = make([]int, k+1)
184+
g[i] = make([]int, k+1)
185+
}
186+
f[1][0] = 1
187+
var mod int = 1e9 + 7
188+
for i := 2; i <= n; i++ {
189+
for j := 0; j <= k; j++ {
190+
f[i][j] = (f[i-1][j] + g[i-1][j]) % mod
191+
g[i][j] = g[i-1][j]
192+
if j > 0 {
193+
g[i][j] += f[i-1][j-1]
194+
g[i][j] %= mod
195+
g[i][j] += g[i-1][j-1]
196+
g[i][j] %= mod
197+
}
198+
}
199+
}
200+
return (f[n][k] + g[n][k]) % mod
201+
}
82202
```
83203

84204
### **...**

solution/1600-1699/1621.Number of Sets of K Non-Overlapping Line Segments/README_EN.md

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,107 @@ The image above shows the 5 different ways {(0,2),(2,3)}, {(0,1),(1,3)}, {(0,1),
4949
### **Python3**
5050

5151
```python
52-
52+
class Solution:
53+
def numberOfSets(self, n: int, k: int) -> int:
54+
mod = 10**9 + 7
55+
f = [[0] * (k + 1) for _ in range(n + 1)]
56+
g = [[0] * (k + 1) for _ in range(n + 1)]
57+
f[1][0] = 1
58+
for i in range(2, n + 1):
59+
for j in range(k + 1):
60+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % mod
61+
g[i][j] = g[i - 1][j]
62+
if j:
63+
g[i][j] += f[i - 1][j - 1]
64+
g[i][j] %= mod
65+
g[i][j] += g[i - 1][j - 1]
66+
g[i][j] %= mod
67+
return (f[-1][-1] + g[-1][-1]) % mod
5368
```
5469

5570
### **Java**
5671

5772
```java
73+
class Solution {
74+
private static final int MOD = (int) 1e9 + 7;
75+
76+
public int numberOfSets(int n, int k) {
77+
int[][] f = new int[n + 1][k + 1];
78+
int[][] g = new int[n + 1][k + 1];
79+
f[1][0] = 1;
80+
for (int i = 2; i <= n; ++i) {
81+
for (int j = 0; j <= k; ++j) {
82+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % MOD;
83+
g[i][j] = g[i - 1][j];
84+
if (j > 0) {
85+
g[i][j] += f[i - 1][j - 1];
86+
g[i][j] %= MOD;
87+
g[i][j] += g[i - 1][j - 1];
88+
g[i][j] %= MOD;
89+
}
90+
}
91+
}
92+
return (f[n][k] + g[n][k]) % MOD;
93+
}
94+
}
95+
```
96+
97+
### **C++**
98+
99+
```cpp
100+
class Solution {
101+
public:
102+
int f[1010][1010];
103+
int g[1010][1010];
104+
const int mod = 1e9 + 7;
105+
106+
int numberOfSets(int n, int k) {
107+
memset(f, 0, sizeof(f));
108+
memset(g, 0, sizeof(g));
109+
f[1][0] = 1;
110+
for (int i = 2; i <= n; ++i) {
111+
for (int j = 0; j <= k; ++j) {
112+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % mod;
113+
g[i][j] = g[i - 1][j];
114+
if (j > 0) {
115+
g[i][j] += f[i - 1][j - 1];
116+
g[i][j] %= mod;
117+
g[i][j] += g[i - 1][j - 1];
118+
g[i][j] %= mod;
119+
}
120+
}
121+
}
122+
return (f[n][k] + g[n][k]) % mod;
123+
}
124+
};
125+
```
58126

127+
### **Go**
128+
129+
```go
130+
func numberOfSets(n int, k int) int {
131+
f := make([][]int, n+1)
132+
g := make([][]int, n+1)
133+
for i := range f {
134+
f[i] = make([]int, k+1)
135+
g[i] = make([]int, k+1)
136+
}
137+
f[1][0] = 1
138+
var mod int = 1e9 + 7
139+
for i := 2; i <= n; i++ {
140+
for j := 0; j <= k; j++ {
141+
f[i][j] = (f[i-1][j] + g[i-1][j]) % mod
142+
g[i][j] = g[i-1][j]
143+
if j > 0 {
144+
g[i][j] += f[i-1][j-1]
145+
g[i][j] %= mod
146+
g[i][j] += g[i-1][j-1]
147+
g[i][j] %= mod
148+
}
149+
}
150+
}
151+
return (f[n][k] + g[n][k]) % mod
152+
}
59153
```
60154

61155
### **...**
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int f[1010][1010];
4+
int g[1010][1010];
5+
const int mod = 1e9 + 7;
6+
7+
int numberOfSets(int n, int k) {
8+
memset(f, 0, sizeof(f));
9+
memset(g, 0, sizeof(g));
10+
f[1][0] = 1;
11+
for (int i = 2; i <= n; ++i) {
12+
for (int j = 0; j <= k; ++j) {
13+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % mod;
14+
g[i][j] = g[i - 1][j];
15+
if (j > 0) {
16+
g[i][j] += f[i - 1][j - 1];
17+
g[i][j] %= mod;
18+
g[i][j] += g[i - 1][j - 1];
19+
g[i][j] %= mod;
20+
}
21+
}
22+
}
23+
return (f[n][k] + g[n][k]) % mod;
24+
}
25+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func numberOfSets(n int, k int) int {
2+
f := make([][]int, n+1)
3+
g := make([][]int, n+1)
4+
for i := range f {
5+
f[i] = make([]int, k+1)
6+
g[i] = make([]int, k+1)
7+
}
8+
f[1][0] = 1
9+
var mod int = 1e9 + 7
10+
for i := 2; i <= n; i++ {
11+
for j := 0; j <= k; j++ {
12+
f[i][j] = (f[i-1][j] + g[i-1][j]) % mod
13+
g[i][j] = g[i-1][j]
14+
if j > 0 {
15+
g[i][j] += f[i-1][j-1]
16+
g[i][j] %= mod
17+
g[i][j] += g[i-1][j-1]
18+
g[i][j] %= mod
19+
}
20+
}
21+
}
22+
return (f[n][k] + g[n][k]) % mod
23+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
private static final int MOD = (int) 1e9 + 7;
3+
4+
public int numberOfSets(int n, int k) {
5+
int[][] f = new int[n + 1][k + 1];
6+
int[][] g = new int[n + 1][k + 1];
7+
f[1][0] = 1;
8+
for (int i = 2; i <= n; ++i) {
9+
for (int j = 0; j <= k; ++j) {
10+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % MOD;
11+
g[i][j] = g[i - 1][j];
12+
if (j > 0) {
13+
g[i][j] += f[i - 1][j - 1];
14+
g[i][j] %= MOD;
15+
g[i][j] += g[i - 1][j - 1];
16+
g[i][j] %= MOD;
17+
}
18+
}
19+
}
20+
return (f[n][k] + g[n][k]) % MOD;
21+
}
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def numberOfSets(self, n: int, k: int) -> int:
3+
mod = 10**9 + 7
4+
f = [[0] * (k + 1) for _ in range(n + 1)]
5+
g = [[0] * (k + 1) for _ in range(n + 1)]
6+
f[1][0] = 1
7+
for i in range(2, n + 1):
8+
for j in range(k + 1):
9+
f[i][j] = (f[i - 1][j] + g[i - 1][j]) % mod
10+
g[i][j] = g[i - 1][j]
11+
if j:
12+
g[i][j] += f[i - 1][j - 1]
13+
g[i][j] %= mod
14+
g[i][j] += g[i - 1][j - 1]
15+
g[i][j] %= mod
16+
return (f[-1][-1] + g[-1][-1]) % mod

0 commit comments

Comments
 (0)