一堆石头,用一个数组表示各堆石头大小,alice和lee选,都只能从头或尾选石头,谁的大就谁赢。求:是否一定能找到赢的方法
class Solution {
public:
bool stoneGame(vector<int>& piles) {
int t=piles.size();
vector<vector<int> >dp(t+1,vector<int>(t,0));
//dp[i][j]为从第i堆石头到第j堆石头中alice跟lee选择的石头差值的最大值
//最终需要求的值是dp[0][t-1],这需要知道dp[0][t-2](即第一种可能:alice选的是最后一个石头)和dp[1][t-1](即另一种可能:alice选的是第一个石头),依次类推,发现对角线上的值是要事先要知道的,且大小为第i堆石头的大小
for(int i=0;i<t;i++)
dp[i][i]=piles[i];
for(int i=t-2;i>=0;i--)
for(int j=i+1;j<t;j++){
//alice选择第i个或j个,那lee从i+1到j或i到j-1选择1个
dp[i][j]=max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1]);
}
return dp[0][t-1]>0;
}
};