Skip to content

Commit 34f4257

Browse files
committed
feat: add solutions to lc problem: No.0877
No.0877.Stone Game
1 parent 3aaa9c5 commit 34f4257

File tree

6 files changed

+190
-32
lines changed

6 files changed

+190
-32
lines changed

solution/0800-0899/0877.Stone Game/README.md

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,32 @@ Alice 先开始,只能拿前 5 颗或后 5 颗石子 。
5151

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

54+
**方法一:动态规划**
55+
56+
设 $dp[i][j]$ 表示在石子堆 $[i,j]$ 中,当前玩家与另一个玩家的石子数量的最大差值。
57+
58+
若 $dp[0][n-1]>0$,说明当前玩家能赢得比赛。
59+
60+
时间复杂度 $O(n^2)$。
61+
5462
<!-- tabs:start -->
5563

5664
### **Python3**
5765

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

6068
```python
61-
69+
class Solution:
70+
def stoneGame(self, piles: List[int]) -> bool:
71+
n = len(piles)
72+
dp = [[0] * n for _ in range(n)]
73+
for i, v in enumerate(piles):
74+
dp[i][i] = v
75+
for i in range(n - 2, -1, -1):
76+
for j in range(i + 1, n):
77+
dp[i][j] = max(piles[i] - dp[i + 1][j],
78+
piles[j] - dp[i][j - 1])
79+
return dp[0][-1] > 0
6280
```
6381

6482
### **Java**
@@ -67,19 +85,62 @@ Alice 先开始,只能拿前 5 颗或后 5 颗石子 。
6785

6886
```java
6987
class Solution {
70-
public boolean stoneGame(int[] ps) {
71-
int n = ps.length;
72-
int[][] f = new int[n + 2][n + 2];
73-
for (int len = 1; len <= n; len++) {
74-
for (int l = 1; l + len - 1 <= n; l++) {
75-
int r = l + len - 1;
76-
int a = ps[l - 1] - f[l + 1][r];
77-
int b = ps[r - 1] - f[l][r - 1];
78-
f[l][r] = Math.max(a, b);
88+
public boolean stoneGame(int[] piles) {
89+
int n = piles.length;
90+
int[][] dp = new int[n][n];
91+
for (int i = 0; i < n; ++i) {
92+
dp[i][i] = piles[i];
93+
}
94+
for (int i = n - 2; i >= 0; --i) {
95+
for (int j = i + 1; j < n; ++j) {
96+
dp[i][j] = Math.max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
7997
}
8098
}
81-
return f[1][n] > 0;
99+
return dp[0][n - 1] > 0;
100+
}
101+
}
102+
```
103+
104+
### **C++**
105+
106+
```cpp
107+
class Solution {
108+
public:
109+
bool stoneGame(vector<int>& piles) {
110+
int n = piles.size();
111+
vector<vector<int>> dp(n, vector<int>(n));
112+
for (int i = 0; i < n; ++i) dp[i][i] = piles[i];
113+
for (int i = n - 2; ~i; --i)
114+
for (int j = i + 1; j < n; ++j)
115+
dp[i][j] = max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
116+
return dp[0][n - 1] > 0;
82117
}
118+
};
119+
```
120+
121+
### **Go**
122+
123+
```go
124+
func stoneGame(piles []int) bool {
125+
n := len(piles)
126+
dp := make([][]int, n)
127+
for i, v := range piles {
128+
dp[i] = make([]int, n)
129+
dp[i][i] = v
130+
}
131+
for i := n - 2; i >= 0; i-- {
132+
for j := i + 1; j < n; j++ {
133+
dp[i][j] = max(piles[i]-dp[i+1][j], piles[j]-dp[i][j-1])
134+
}
135+
}
136+
return dp[0][n-1] > 0
137+
}
138+
139+
func max(a, b int) int {
140+
if a > b {
141+
return a
142+
}
143+
return b
83144
}
84145
```
85146

solution/0800-0899/0877.Stone Game/README_EN.md

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,79 @@ This demonstrated that taking the first 5 was a winning move for Alice, so we re
5050
### **Python3**
5151

5252
```python
53-
53+
class Solution:
54+
def stoneGame(self, piles: List[int]) -> bool:
55+
n = len(piles)
56+
dp = [[0] * n for _ in range(n)]
57+
for i, v in enumerate(piles):
58+
dp[i][i] = v
59+
for i in range(n - 2, -1, -1):
60+
for j in range(i + 1, n):
61+
dp[i][j] = max(piles[i] - dp[i + 1][j],
62+
piles[j] - dp[i][j - 1])
63+
return dp[0][-1] > 0
5464
```
5565

5666
### **Java**
5767

5868
```java
5969
class Solution {
60-
public boolean stoneGame(int[] ps) {
61-
int n = ps.length;
62-
int[][] f = new int[n + 2][n + 2];
63-
for (int len = 1; len <= n; len++) {
64-
for (int l = 1; l + len - 1 <= n; l++) {
65-
int r = l + len - 1;
66-
int a = ps[l - 1] - f[l + 1][r];
67-
int b = ps[r - 1] - f[l][r - 1];
68-
f[l][r] = Math.max(a, b);
70+
public boolean stoneGame(int[] piles) {
71+
int n = piles.length;
72+
int[][] dp = new int[n][n];
73+
for (int i = 0; i < n; ++i) {
74+
dp[i][i] = piles[i];
75+
}
76+
for (int i = n - 2; i >= 0; --i) {
77+
for (int j = i + 1; j < n; ++j) {
78+
dp[i][j] = Math.max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
6979
}
7080
}
71-
return f[1][n] > 0;
81+
return dp[0][n - 1] > 0;
82+
}
83+
}
84+
```
85+
86+
### **C++**
87+
88+
```cpp
89+
class Solution {
90+
public:
91+
bool stoneGame(vector<int>& piles) {
92+
int n = piles.size();
93+
vector<vector<int>> dp(n, vector<int>(n));
94+
for (int i = 0; i < n; ++i) dp[i][i] = piles[i];
95+
for (int i = n - 2; ~i; --i)
96+
for (int j = i + 1; j < n; ++j)
97+
dp[i][j] = max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
98+
return dp[0][n - 1] > 0;
7299
}
100+
};
101+
```
102+
103+
### **Go**
104+
105+
```go
106+
func stoneGame(piles []int) bool {
107+
n := len(piles)
108+
dp := make([][]int, n)
109+
for i, v := range piles {
110+
dp[i] = make([]int, n)
111+
dp[i][i] = v
112+
}
113+
for i := n - 2; i >= 0; i-- {
114+
for j := i + 1; j < n; j++ {
115+
dp[i][j] = max(piles[i]-dp[i+1][j], piles[j]-dp[i][j-1])
116+
}
117+
}
118+
return dp[0][n-1] > 0
119+
}
120+
121+
func max(a, b int) int {
122+
if a > b {
123+
return a
124+
}
125+
return b
73126
}
74127
```
75128

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public:
3+
bool stoneGame(vector<int>& piles) {
4+
int n = piles.size();
5+
vector<vector<int>> dp(n, vector<int>(n));
6+
for (int i = 0; i < n; ++i) dp[i][i] = piles[i];
7+
for (int i = n - 2; ~i; --i)
8+
for (int j = i + 1; j < n; ++j)
9+
dp[i][j] = max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
10+
return dp[0][n - 1] > 0;
11+
}
12+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
func stoneGame(piles []int) bool {
2+
n := len(piles)
3+
dp := make([][]int, n)
4+
for i, v := range piles {
5+
dp[i] = make([]int, n)
6+
dp[i][i] = v
7+
}
8+
for i := n - 2; i >= 0; i-- {
9+
for j := i + 1; j < n; j++ {
10+
dp[i][j] = max(piles[i]-dp[i+1][j], piles[j]-dp[i][j-1])
11+
}
12+
}
13+
return dp[0][n-1] > 0
14+
}
15+
16+
func max(a, b int) int {
17+
if a > b {
18+
return a
19+
}
20+
return b
21+
}
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
class Solution {
2-
public boolean stoneGame(int[] ps) {
3-
int n = ps.length;
4-
int[][] f = new int[n + 2][n + 2];
5-
for (int len = 1; len <= n; len++) {
6-
for (int l = 1; l + len - 1 <= n; l++) {
7-
int r = l + len - 1;
8-
int a = ps[l - 1] - f[l + 1][r];
9-
int b = ps[r - 1] - f[l][r - 1];
10-
f[l][r] = Math.max(a, b);
2+
public boolean stoneGame(int[] piles) {
3+
int n = piles.length;
4+
int[][] dp = new int[n][n];
5+
for (int i = 0; i < n; ++i) {
6+
dp[i][i] = piles[i];
7+
}
8+
for (int i = n - 2; i >= 0; --i) {
9+
for (int j = i + 1; j < n; ++j) {
10+
dp[i][j] = Math.max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
1111
}
1212
}
13-
return f[1][n] > 0;
13+
return dp[0][n - 1] > 0;
1414
}
1515
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution:
2+
def stoneGame(self, piles: List[int]) -> bool:
3+
n = len(piles)
4+
dp = [[0] * n for _ in range(n)]
5+
for i, v in enumerate(piles):
6+
dp[i][i] = v
7+
for i in range(n - 2, -1, -1):
8+
for j in range(i + 1, n):
9+
dp[i][j] = max(piles[i] - dp[i + 1][j],
10+
piles[j] - dp[i][j - 1])
11+
return dp[0][-1] > 0

0 commit comments

Comments
 (0)