Coins in a Line II(硬币排成线 II)

http://www.lintcode.com/zh-cn/problem/coins-in-a-line-ii/?rand=true

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) {
        // write your code here
        int[] dp = new int[values.length + 1];
//        dp表示i到最后第一个人能拿到的最大值。
        int sum = 0;
        for (int i = values.length; i >= 0; i--) {
            if (i == values.length) {
//                最后一个没有值,所以是0
                dp[i] = 0;
                continue;
            }
//            记录总数的和,算出来第一个人,第二个人就也出来了
            sum += values[i];
            if (i == values.length - 1) {
//                后边只有一个数时,第一个人取
                dp[i] = values[i];
            } else if (i == values.length - 2 || i == values.length - 3) {
//                后边有两个或三个数时,第一个人取两个,保证对方最少
                dp[i] = values[i] + values[i + 1];
            } else {
//                自己可能取一个,也可能取两个,但是不管怎么取,对方肯定想让自己最小
//                所以是对方取一个,或者对方取两个的小值。
                dp[i] = Math.max(values[i] + Math.min(dp[i + 2], dp[i + 3]),
                        values[i] + values[i + 1] + Math.min(dp[i + 3], dp[i + 4]));
            }
        }
        return dp[0] > sum - dp[0];
    }

}

你可能感兴趣的:(Coins in a Line II(硬币排成线 II))