题目链接:leetcode486
思路:和877石子合并那题类似,只不过少了堆数为奇数的约束,记忆化搜索即可,最大化最小值,每轮博弈完成剩余的状态一定是最少的,也可以改为 O ( n 2 ) O(n^2) O(n2)的递推。
class Solution {
public:
bool PredictTheWinner(vector<int>& piles) {
long long d[21][21]={0};
long long sum=0;
for(int i=0; i<piles.size(); i++) sum+=piles[i];
return 2 * dp(0, piles.size()-1, d, piles) >= sum;
}
int dp(unsigned int l, unsigned int r, long long d[][21], vector<int>& piles) {
if(r-l==0) return d[l][r]=piles[l];
if(r-l==1) return d[l][r]=max(piles[l], piles[r]);
if(d[l][r]) return d[l][r];
return d[l][r]=max(piles[l]+min(dp(l+2, r, d, piles), dp(l+1, r-1, d, piles)), piles[r]+min(dp(l+1, r-1, d, piles), dp(l, r-2, d, piles))); //一次博弈后剩余的最少
}
};