问题描述
解题报告
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示先手与后手所获得的石子之差。
d
p
[
i
]
[
j
]
=
m
a
x
(
p
i
l
e
s
[
i
]
−
d
p
[
i
+
1
]
[
j
]
,
p
i
l
e
s
[
j
]
−
d
p
[
i
]
[
j
−
1
]
)
dp[i][j]=max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1])
dp[i][j]=max(piles[i]−dp[i+1][j],piles[j]−dp[i][j−1])
实现代码
/*
相当于`脑筋急转弯`
偶数堆石子;石子的总数为奇数
石子总数为奇数位上的数字+偶数位上的数字,且奇数位上的数字和偶数位上的数字必然不同【石子的总数为奇数】
亚历克斯可以控制只选择奇数位上的数字或者只选择偶数位上的数字。
*/
// class Solution {
// public:
// bool stoneGame(vector<int>& piles) {
// return true;
// }
// };
// 从小到大进行构造,i表示长度,j表示起点
//dp[i][j]表示Alex和李的石子之差
class Solution {
public:
bool stoneGame(vector<int>& piles) {
int n = piles.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
for(int i = 0; i < n; i++) {
dp[i][i] = piles[i];
}
for(int i = 1; i < n; i++) {
for(int j = 0; j < n - i; j++) {
dp[j][j+i] = max(piles[j]-dp[j+1][j+i], piles[j+i]-dp[j][j+i-1]);
}
}
return dp[0][n-1] > 0;
}
};