成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Lintcode Coins in a line II

2shou / 3243人閱讀

摘要:兩個(gè)參賽者輪流從左邊依次拿走或個(gè)硬幣,直到?jīng)]有硬幣為止。計(jì)算兩個(gè)人分別拿到的硬幣總價(jià)值,價(jià)值高的人獲勝。請(qǐng)判定第一個(gè)玩家是輸還是贏樣例給定數(shù)組返回給定數(shù)組返回復(fù)雜度思路考慮先手玩家在狀態(tài),表示在在第的硬幣的時(shí)候,這一位玩家能拿到的最高價(jià)值。

LintCode Coins in a line II

有 n 個(gè)不同價(jià)值的硬幣排成一條線。兩個(gè)參賽者輪流從左邊依次拿走 1 或 2 個(gè)硬幣,直到?jīng)]有硬幣為止。計(jì)算兩個(gè)人分別拿到的硬幣總價(jià)值,價(jià)值高的人獲勝。

請(qǐng)判定 第一個(gè)玩家 是輸還是贏?

樣例
給定數(shù)組 A = [1,2,2], 返回 true.
給定數(shù)組 A = [1,2,4], 返回 false.

dp

復(fù)雜度
O(N)

思路
考慮先手玩家在狀態(tài)dp[i],dp[i]表示在在第i的硬幣的時(shí)候,這一位玩家能拿到的最高價(jià)值。
如果先手玩家取一枚硬幣,那么dp[i] = values[i] + sum[i + 1] - dp[i + 1]。減去dp[i + 1]的原因是,對(duì)手玩家,每次也要想辦法拿到最大的價(jià)值,所以先手玩家能拿到的價(jià)值是在對(duì)手玩家拿到最大價(jià)值的硬幣之后的剩余的硬幣價(jià)值。

如果先手玩家取兩枚,那么dp[i] = values[i] + values[i + 1] + sum[i + 2] - dp[i + 2];

注意判斷是否先手玩家贏的條件,是2倍dp[0]的值是不是大于sum[0],應(yīng)為是要求拿到硬幣價(jià)值多的玩家算贏。

代碼

public boolean firstWillWin(int[] values) {
    int len = values.length;
    int[] sum = new int[len];
    int[] dp = new int[len];
    for(int i = len - 1; i >= 0; i --) {
        if(i == len - 1) sum[i] = values[i];
        else sum[i] = values[i] + sum[i + 1];
    }
    for(int i = len - 1; i >= 0; i --) {
        if(i == len - 1) dp[i] = values[i];
        else if(i == len - 2) dp[i] = values[i] + values[i + 1];
        else {
            dp[i] = Math.max(values[i] + sum[i + 1] - dp[i + 1], values[i] + values[i + 2] + sum[i + 2] - dp[i + 2]);
        }
    }
    return dp[0] * 2 > sum[0];
}
Recursion + Memorization

復(fù)雜度
O(N),O(N)

思路
思路是一樣,不過是從bottom-up的算法,用map來保存已經(jīng)搜索過的路線。

代碼

Map map = new HashMap<>();
public int helper(int left, int right, int[] values, int[] sum) {
    // Base case;
    if(left > right) return 0;
    if(left == right) return values[left];
    if(left + 1 == right) return values[left] + values[right];
    if(map.containsKey(left)) return map.get(left);
    //
    int val = Math.max(values[left] + sum[left + 1] + helper(left + 1, right, values, sum), values[left] + values[left + 1] + sum[left + 2] + helper(left + 2, right, values, sum));
    map.put(left, val);
    return val;
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65257.html

相關(guān)文章

  • LintCode Coins in a line III

    摘要:復(fù)雜度思路參考的思路,對(duì)于,表示在從到的范圍內(nèi),先手玩家能拿到的最大的硬幣價(jià)值。對(duì)于狀態(tài),先手玩家有兩種選擇,要么拿的硬幣,要么拿的硬幣左邊一個(gè)的或者右邊一側(cè)的,如果拿左側(cè)的硬幣,如果拿右側(cè)的硬幣,取兩個(gè)值的最大值。 LintCode Coins in a line III There are n coins in a line. Two players take turns to ...

    focusj 評(píng)論0 收藏0
  • [LintCode] Coins in a Line I &amp; Coins in a Line

    摘要:第一個(gè)游戲者永遠(yuǎn)拿不到第枚硬幣,所以在硬幣總數(shù)不能被整除的情況下,都可以贏。做法,設(shè)為第一個(gè)游戲者從第枚硬幣到能獲得硬幣價(jià)值的最大值。主要參考這篇文章的解釋 Coins in a Line I Solution 第一個(gè)游戲者永遠(yuǎn)拿不到第3n枚硬幣,所以在硬幣總數(shù)不能被3整除的情況下,都可以贏。 public class Solution { public boolean fi...

    xzavier 評(píng)論0 收藏0
  • Lintcode Coins in a line

    摘要:有個(gè)硬幣排成一條線。兩個(gè)參賽者輪流從右邊依次拿走或個(gè)硬幣,直到?jīng)]有硬幣為止。拿到最后一枚硬幣的人獲勝。表示的是,當(dāng)有個(gè)棋子的時(shí)候,先手玩家會(huì)不會(huì)輸。贏得條件是,和的狀態(tài)是輸?shù)臓顟B(tài)。 LintCode: coins in a line I 有 n 個(gè)硬幣排成一條線。兩個(gè)參賽者輪流從右邊依次拿走 1 或 2 個(gè)硬幣,直到?jīng)]有硬幣為止。拿到最后一枚硬幣的人獲勝。 請(qǐng)判定 第一個(gè)玩家 是輸還...

    itvincent 評(píng)論0 收藏0
  • [LintCode/LeetCode] Subsets &amp; Subsets II

    Subsets Problem Given a set of distinct integers, return all possible subsets. Notice Elements in a subset must be in non-descending order.The solution set must not contain duplicate subsets. Example ...

    tracy 評(píng)論0 收藏0
  • [LintCode/LeetCode] Combination Sum I &amp; II

    摘要:和唯一的不同是組合中不能存在重復(fù)的元素,因此,在遞歸時(shí)將初始位即可。 Combination Sum I Problem Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T...

    ThreeWords 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<