Skip to content

Commit b28600f

Browse files
committed
feat: add solutions to lc problem: No.0375
No.0375.Guess Number Higher or Lower II
1 parent f7655d1 commit b28600f

File tree

6 files changed

+259
-4
lines changed

6 files changed

+259
-4
lines changed

solution/0300-0399/0375.Guess Number Higher or Lower II/README.md

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,119 @@
2929

3030
<p>给定&nbsp;<strong>n &ge; 1,</strong>计算你至少需要拥有多少现金才能确保你能赢得这个游戏。</p>
3131

32-
3332
## 解法
3433

3534
<!-- 这里可写通用的实现逻辑 -->
3635

36+
区间 DP。
37+
38+
- 状态表示:`dp[i][j]` 表示数字区间 `[i, j]` 确保赢得游戏的最少现金。
39+
- 状态计算:枚举闭区间 `[i, j]` 中以数字 k 作为选择的数字。那么 `dp[i][j] = min(dp[i][j], max(dp[i][k - 1], dp[k + 1][j]) + k), k ∈ [i, j]`
40+
41+
以区间长度 l 从小到大开始处理每个状态值。
42+
3743
<!-- tabs:start -->
3844

3945
### **Python3**
4046

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

4349
```python
44-
50+
class Solution:
51+
def getMoneyAmount(self, n: int) -> int:
52+
dp = [[0] * (n + 10) for _ in range(n + 10)]
53+
for l in range(2, n + 1):
54+
for i in range(1, n - l + 2):
55+
j = i + l - 1
56+
dp[i][j] = float('inf')
57+
for k in range(i, j + 1):
58+
t = max(dp[i][k - 1], dp[k + 1][j]) + k
59+
dp[i][j] = min(dp[i][j], t)
60+
return dp[1][n]
4561
```
4662

4763
### **Java**
4864

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

5167
```java
68+
class Solution {
69+
public int getMoneyAmount(int n) {
70+
int[][] dp = new int[n + 10][n + 10];
71+
for (int l = 2; l <= n; ++l) {
72+
for (int i = 1; i + l - 1 <= n; ++i) {
73+
int j = i + l - 1;
74+
dp[i][j] = Integer.MAX_VALUE;
75+
for (int k = i; k <= j; ++k) {
76+
int t = Math.max(dp[i][k - 1], dp[k + 1][j]) + k;
77+
dp[i][j] = Math.min(dp[i][j], t);
78+
}
79+
}
80+
}
81+
return dp[1][n];
82+
}
83+
}
84+
```
85+
86+
### **C++**
87+
88+
```cpp
89+
class Solution {
90+
public:
91+
int getMoneyAmount(int n) {
92+
vector<vector<int>> dp(n + 10, vector<int>(n + 10));
93+
for (int l = 2; l <= n; ++l)
94+
{
95+
for (int i = 1; i + l - 1 <= n; ++i)
96+
{
97+
int j = i + l - 1;
98+
dp[i][j] = INT_MAX;
99+
for (int k = i; k <= j; ++k)
100+
{
101+
int t = max(dp[i][k - 1], dp[k + 1][j]) + k;
102+
dp[i][j] = min(dp[i][j], t);
103+
}
104+
}
105+
}
106+
return dp[1][n];
107+
}
108+
};
109+
```
52110
111+
### **Go**
112+
113+
```go
114+
func getMoneyAmount(n int) int {
115+
dp := make([][]int, n+10)
116+
for i := 0; i < len(dp); i++ {
117+
dp[i] = make([]int, n+10)
118+
}
119+
for l := 2; l <= n; l++ {
120+
for i := 1; i+l-1 <= n; i++ {
121+
j := i + l - 1
122+
dp[i][j] = math.MaxInt32
123+
for k := i; k <= j; k++ {
124+
t := max(dp[i][k-1], dp[k+1][j]) + k
125+
dp[i][j] = min(dp[i][j], t)
126+
}
127+
}
128+
}
129+
return dp[1][n]
130+
}
131+
132+
func max(a, b int) int {
133+
if a > b {
134+
return a
135+
}
136+
return b
137+
}
138+
139+
func min(a, b int) int {
140+
if a < b {
141+
return a
142+
}
143+
return b
144+
}
53145
```
54146

55147
### **...**

solution/0300-0399/0375.Guess Number Higher or Lower II/README_EN.md

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,106 @@ The worst case is that you pay $1.
6868
<li><code>1 &lt;= n &lt;= 200</code></li>
6969
</ul>
7070

71-
7271
## Solutions
7372

7473
<!-- tabs:start -->
7574

7675
### **Python3**
7776

7877
```python
79-
78+
class Solution:
79+
def getMoneyAmount(self, n: int) -> int:
80+
dp = [[0] * (n + 10) for _ in range(n + 10)]
81+
for l in range(2, n + 1):
82+
for i in range(1, n - l + 2):
83+
j = i + l - 1
84+
dp[i][j] = float('inf')
85+
for k in range(i, j + 1):
86+
t = max(dp[i][k - 1], dp[k + 1][j]) + k
87+
dp[i][j] = min(dp[i][j], t)
88+
return dp[1][n]
8089
```
8190

8291
### **Java**
8392

8493
```java
94+
class Solution {
95+
public int getMoneyAmount(int n) {
96+
int[][] dp = new int[n + 10][n + 10];
97+
for (int l = 2; l <= n; ++l) {
98+
for (int i = 1; i + l - 1 <= n; ++i) {
99+
int j = i + l - 1;
100+
dp[i][j] = Integer.MAX_VALUE;
101+
for (int k = i; k <= j; ++k) {
102+
int t = Math.max(dp[i][k - 1], dp[k + 1][j]) + k;
103+
dp[i][j] = Math.min(dp[i][j], t);
104+
}
105+
}
106+
}
107+
return dp[1][n];
108+
}
109+
}
110+
```
111+
112+
### **C++**
113+
114+
```cpp
115+
class Solution {
116+
public:
117+
int getMoneyAmount(int n) {
118+
vector<vector<int>> dp(n + 10, vector<int>(n + 10));
119+
for (int l = 2; l <= n; ++l)
120+
{
121+
for (int i = 1; i + l - 1 <= n; ++i)
122+
{
123+
int j = i + l - 1;
124+
dp[i][j] = INT_MAX;
125+
for (int k = i; k <= j; ++k)
126+
{
127+
int t = max(dp[i][k - 1], dp[k + 1][j]) + k;
128+
dp[i][j] = min(dp[i][j], t);
129+
}
130+
}
131+
}
132+
return dp[1][n];
133+
}
134+
};
135+
```
85136
137+
### **Go**
138+
139+
```go
140+
func getMoneyAmount(n int) int {
141+
dp := make([][]int, n+10)
142+
for i := 0; i < len(dp); i++ {
143+
dp[i] = make([]int, n+10)
144+
}
145+
for l := 2; l <= n; l++ {
146+
for i := 1; i+l-1 <= n; i++ {
147+
j := i + l - 1
148+
dp[i][j] = math.MaxInt32
149+
for k := i; k <= j; k++ {
150+
t := max(dp[i][k-1], dp[k+1][j]) + k
151+
dp[i][j] = min(dp[i][j], t)
152+
}
153+
}
154+
}
155+
return dp[1][n]
156+
}
157+
158+
func max(a, b int) int {
159+
if a > b {
160+
return a
161+
}
162+
return b
163+
}
164+
165+
func min(a, b int) int {
166+
if a < b {
167+
return a
168+
}
169+
return b
170+
}
86171
```
87172

88173
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int getMoneyAmount(int n) {
4+
vector<vector<int>> dp(n + 10, vector<int>(n + 10));
5+
for (int l = 2; l <= n; ++l)
6+
{
7+
for (int i = 1; i + l - 1 <= n; ++i)
8+
{
9+
int j = i + l - 1;
10+
dp[i][j] = INT_MAX;
11+
for (int k = i; k <= j; ++k)
12+
{
13+
int t = max(dp[i][k - 1], dp[k + 1][j]) + k;
14+
dp[i][j] = min(dp[i][j], t);
15+
}
16+
}
17+
}
18+
return dp[1][n];
19+
}
20+
};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
func getMoneyAmount(n int) int {
2+
dp := make([][]int, n+10)
3+
for i := 0; i < len(dp); i++ {
4+
dp[i] = make([]int, n+10)
5+
}
6+
for l := 2; l <= n; l++ {
7+
for i := 1; i+l-1 <= n; i++ {
8+
j := i + l - 1
9+
dp[i][j] = math.MaxInt32
10+
for k := i; k <= j; k++ {
11+
t := max(dp[i][k-1], dp[k+1][j]) + k
12+
dp[i][j] = min(dp[i][j], t)
13+
}
14+
}
15+
}
16+
return dp[1][n]
17+
}
18+
19+
func max(a, b int) int {
20+
if a > b {
21+
return a
22+
}
23+
return b
24+
}
25+
26+
func min(a, b int) int {
27+
if a < b {
28+
return a
29+
}
30+
return b
31+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
public int getMoneyAmount(int n) {
3+
int[][] dp = new int[n + 10][n + 10];
4+
for (int l = 2; l <= n; ++l) {
5+
for (int i = 1; i + l - 1 <= n; ++i) {
6+
int j = i + l - 1;
7+
dp[i][j] = Integer.MAX_VALUE;
8+
for (int k = i; k <= j; ++k) {
9+
int t = Math.max(dp[i][k - 1], dp[k + 1][j]) + k;
10+
dp[i][j] = Math.min(dp[i][j], t);
11+
}
12+
}
13+
}
14+
return dp[1][n];
15+
}
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution:
2+
def getMoneyAmount(self, n: int) -> int:
3+
dp = [[0] * (n + 10) for _ in range(n + 10)]
4+
for l in range(2, n + 1):
5+
for i in range(1, n - l + 2):
6+
j = i + l - 1
7+
dp[i][j] = float('inf')
8+
for k in range(i, j + 1):
9+
t = max(dp[i][k - 1], dp[k + 1][j]) + k
10+
dp[i][j] = min(dp[i][j], t)
11+
return dp[1][n]

0 commit comments

Comments
 (0)