有 n
个硬币排成一条线,每一枚硬币有不同的价值。两个参赛者轮流从任意一边取一枚硬币,知道没有硬币为止。计算拿到的硬币总价值,价值最高的获胜。
请判定 第一个玩家 是输还是赢?
样例
给定数组 A = [3,2,2]
, 返回 true
.
给定数组 A = [1,2,4]
, 返回 true
.
给定数组 A = [1,20,4]
, 返回 false
.
class Solution {
public:
/**
* @param values: a vector of integers
* @return: a boolean which equals to true if the first player will win
*/
bool firstWillWin(vector<int> &values) {
// write your code here
int n = values.size();
if (n < 3)
{
return true;
}
vector<vector<int> > buf(n, vector<int>(n, 0));
int sum = 0;
for (int i = n-1; i >= 0; i--)
{
sum += values[i];
for (int j = i; j < n; j++)
{
if (i == j)
{
buf[i][j] = values[i];
}
else if (j-i == 1)
{
buf[i][j] = max(values[i], values[j]);
}
else if (j-i == 2)
{
if (values[i+1] >= values[i] && values[i+1] >= values[i+2])
{
buf[i][j] = values[i] + values[j];
}
else
{
int minV = values[i];
int maxV = values[i];
for (int k = i+1; k <= j; k++)
{
if (values[k] < minV)
{
minV = values[k];
}
if (values[k] > maxV)
{
maxV = values[k];
}
}
buf[i][j] = minV + maxV;
}
}
else
{
buf[i][j] = max(values[i] + min(buf[i+2][j], buf[i+1][j-1]),
values[j] + min(buf[i][j-2], buf[i+1][j-1]));
}
}
}
return buf[0][n-1] > sum-buf[0][n-1];
}
};