1、直接判胜;
2、计算从i到j的胜利点数。这里用超过对手的点数来表示胜负。
首先,既然d[0][n-1] = max(p[0]-d[1][n-1], p[n]-d[0][n-2]
,那么,这样依次扫描即可。但需要注意的是边界条件,即d[i][j] 是什么:需要计算每一个区间的最值。这里使用区间距离来拆分,即将其拆成多个长度为1/2/3…/n的区间分别计算每个区间最值,才能得出d[0][n-1]
因此两层循环,外层区间长度,内层遍历区间获取其最值。
class Solution {
public:
bool stoneGame(vector<int>& piles) {
vector<vector<int>> dp(piles.size(), vector<int>(piles.size(), 0));
for(int i = 0; i < piles.size(); i++)
dp[i][i] = piles[i];
for(int d = 1; d < piles.size(); d++){
for(int i = 0; i < piles.size()-d; i++){
dp[i][i+d] = max(piles[i]-dp[i+1][i+d], piles[i+d]-dp[i][i+d-1]);
}
}
return dp[0][piles.size()-1] > 0;
}
};