题目链接,描述
https://www.lintcode.com/problem/395
有 n 个不同价值的硬币排成一条线。两个参赛者轮流从 左边 依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。
请判定 先手玩家 必胜还是必败?
若必胜, 返回 true, 否则返回 false.
样例
样例 1:
输入: [1, 2, 2]
输出: true
解释: 先手玩家直接拿走两颗硬币即可.
样例 2:
输入: [1, 2, 4]
输出: false
解释: 无论先手拿一个还是两个, 后手可以拿完, 然后总价值更高.
参考代码
public class Solution {
/**
* @param values: a vector of integers
* @return: a boolean which equals to true if the first player will win
*/
public boolean firstWillWin(int[] values) {
//从末尾往前面思考。参考了III的区间型动态规划解法。
// a - b =f[i];最后要a >= b 即 f[0] > 0。
int n= values.length;
if(n ==1 || n==2) return true;
int[] dp = new int[n];
dp[n-1]= values[n-1];
dp[n-2]= values[n-1]+values[n-2];
for (int i = n-3; i >=0 ; i--) {
dp[i] = Math.max(values[i]-dp[i+1],values[i]+values[i+1]-dp[i+2]);
}
return dp[0] >=0;
}
}