LintCode-硬币排成线 II

有 n 个不同价值的硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。

请判定 第一个玩家 是输还是赢?

样例

给定数组 A = [1,2,2],
返回 true.

给定数组 A = [1,2,4],
返回 false.

分析:肯定还是动态规划问题,而已可以知道dp[i]肯定和dp[i-1],dp[i-2]有关,注意根据样例的情况,应该是轮流从左拿走1或2个硬币,用dp[i] 表示到第i个硬币时使得先手数量最大的状态。

代码:

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<=2)
            return true;
        vector<pair<int,int> > dp(n,make_pair(0,0));
        dp[n-1] = make_pair(values[n-1],0);
        dp[n-2] = make_pair(values[n-1]+values[n-2],0);
        for(int i=n-3;i>=0;i--)
        {
            pair<int,int> p1 = dp[i+1];
            pair<int,int> p2 = dp[i+2];
            if(p1.second+values[i]>p2.second+values[i]+values[i+1])
            {
                dp[i] = make_pair(p1.second+values[i],p1.first);
            }
            else
            {
                dp[i] = make_pair(p2.second+values[i]+values[i+1],p2.first);
            }
        }
        return dp[0].first>dp[0].second;
    }
};
时间: 2024-12-09 15:59:01

LintCode-硬币排成线 II的相关文章

lintcode 中等题:Coins in Line II 硬币排成线 II

题目 硬币排成线 II 有 n 个不同价值的硬币排成一条线.两个参赛者轮流从左边依次拿走 1 或 2 个硬币,直到没有硬币为止.计算两个人分别拿到的硬币总价值,价值高的人获胜. 请判定 第一个玩家 是输还是赢? 样例 给定数组 A = [1,2,2], 返回 true. 给定数组 A = [1,2,4], 返回 false. 解题 动态规划.博弈论 坑死,看了好久 定义dp[i]表示从i到end能取到的最大值 当我们在i处,有两种选择: 1.若取values[i],对方可以取values[i+1

lintcode 中等题:Coins in a Line 硬币排成线

题目 硬币排成线 有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? 样例 n = 1, 返回 true. n = 2, 返回 true. n = 3, 返回 false. n = 4, 返回 true. n = 5, 返回 true. 挑战 O(1) 时间复杂度且O(1) 存储. 解题 两个人在一次拿的时候,当第一个人拿的是1 时,第二个人拿的就是2:当第一个人拿的是2时,第二个人拿的就是1

硬币排成线

题目描述:有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜.请判定 第一个玩家 是输还是赢? 样例: n = 1, 返回 true. n = 2, 返回 true. n = 3, 返回 false. n = 4, 返回 true. n = 5, 返回 true. 好吧,我不得不承认,我并不知道这个题目考察的点是计算机科学中的哪个部分.如果有人知道,烦请告知. 就题目本身而言,更像是一道智力题.你可以这样想,如果硬币的数目是3的

LintCode之硬币排成线

输入的n可以分为两种情况: 1. 如果n是3的倍数的话,不论A怎么拿B都可以拿(3-A拿的个数)来使其保持是3的倍数,他就一定能拿到最后一块,所以n是3的倍数的话B必胜 2. 如果n不是3的倍数的话,那么A就能够拿1或者2块使其变为3的倍数,就相当于B变成了第一种情况中的A,所以n不是3的倍数的话A必胜 AC代码: class Solution: """ @param: n: An integer @return: A boolean which equals to true

H. 硬币水题II

H. 硬币水题II Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Submit Status PID: 29064 Font Size:  +   - 小胖有一个正反面不对称的硬币.如果抛一次这个硬币,它的正面朝上的概率为p,反面朝上的概率为1-p.现在,小胖想用这个硬币来产生等概率的决策(50%对

BNU29064——硬币水题II——————【事件概率】

硬币水题II Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Submit Status PID: 29064 小胖有一个正反面不对称的硬币.如果抛一次这个硬币,它的正面朝上的概率为p,反面朝上的概率为1-p.现在,小胖想用这个硬币来产生等概率的决策(50%对50%).当然,只抛一次是不行的.小胖的策略是这样的:每一次决策,需要抛硬币两次,如果都是

[poj] The Wedding Juicer | [lintcode] Trapping Rain Water II

问题描述 给定一个二维矩阵,每个元素都有一个正整数值,表示高度.这样构成了一个二维的.有高度的物体.请问该矩阵可以盛放多少水? 相关题目:POJ The Wedding Juicer Description Farmer John's cows have taken a side job designing interesting punch-bowl designs. The designs are created as follows: * A flat board of size W cm

[LintCode] Trapping Rain Water II

Trapping Rain Water II Given n x m non-negative integers representing an elevation map 2d where the area of each cell is 1 x 1, compute how much water it is able to trap after raining. Example Given 5*4 matrix [12,13,0,12] [13,4,13,12] [13,8,10,12] [

[lintcode medium]Maximum Subarray II

Maximum Subarray II Given an array of integers, find two non-overlapping subarrays which have the largest sum. The number in each subarray should be contiguous. Return the largest sum. Example For given [1, 3, -1, 2, -1, 2], the two subarrays are [1,