摘要:復(fù)雜度思路參考的思路,對(duì)于,表示在從到的范圍內(nèi),先手玩家能拿到的最大的硬幣價(jià)值。對(duì)于狀態(tài),先手玩家有兩種選擇,要么拿的硬幣,要么拿的硬幣左邊一個(gè)的或者右邊一側(cè)的,如果拿左側(cè)的硬幣,如果拿右側(cè)的硬幣,取兩個(gè)值的最大值。
LintCode Coins in a line III
Recursion + MemorizationThere are n coins in a line. Two players take turns to take a coin from one of the ends of the line until there are no more coins left. The player with the larger amount of money wins.
Could you please decide the first player will win or lose?Example
Given array A = [3,2,2], return true.
Given array A = [1,2,4], return true.
Given array A = [1,20,4], return false.
復(fù)雜度
O(N^2), O(N^2)
思路
參考coins II的思路,對(duì)于dpi,表示在從i到j(luò)的范圍內(nèi),先手玩家能拿到的最大的硬幣價(jià)值。
對(duì)于狀態(tài)dpi,先手玩家有兩種選擇, 要么拿num[i]的硬幣,要么拿num[j]的硬幣(左邊一個(gè)的或者右邊一側(cè)的),
如果拿左側(cè)的硬幣,dpi = num[i] + sumi + 1 - dpi + 1
如果拿右側(cè)的硬幣,dpi = num[j] + sumi - dpi
取兩個(gè)值的最大值。
也可以用dp寫(xiě)。
for(int k = 2; k < len; k ++) { for(int i = 0; i < len - k; i ++) { int right = i + k; dp[i][right] = Math.max(); } }
代碼
int len; Mapmap = new HashMap<>(); public boolean coins(int[] num) { len = num.length; int[] sum = new int[len]; for(int i = 0; i < len; i ++) { if(i == 0) sum[i] = num[i]; else sum[i] = num[i] + sum[i - 1]; } return helper(num, 0, len - 1, sum) * 2 > sum[len - 1]; } public int helper(int[] num, int left, int right, int[] sum) { // base case; if(left > right) return 0; if(left == right) return num[left]; if(map.containsKey(left * len + right)) return map.get(left * left + right); // int val = Math.max(num[left] + getSum(left + 1, right, sum) - helper(num, left + 1, right, sum), num[right] + getSum(left, right - 1, sum) - helper(num, left, right - 1, sum)); map.put(left * len + right, val); return val; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65256.html
摘要:第一個(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...
摘要:有個(gè)硬幣排成一條線(xiàn)。兩個(gè)參賽者輪流從右邊依次拿走或個(gè)硬幣,直到?jīng)]有硬幣為止。拿到最后一枚硬幣的人獲勝。表示的是,當(dāng)有個(gè)棋子的時(shí)候,先手玩家會(huì)不會(huì)輸。贏得條件是,和的狀態(tài)是輸?shù)臓顟B(tài)。 LintCode: coins in a line I 有 n 個(gè)硬幣排成一條線(xiàn)。兩個(gè)參賽者輪流從右邊依次拿走 1 或 2 個(gè)硬幣,直到?jīng)]有硬幣為止。拿到最后一枚硬幣的人獲勝。 請(qǐng)判定 第一個(gè)玩家 是輸還...
摘要:兩個(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à)值的硬幣排成一條線(xiàn)。兩個(gè)參賽者輪流從左邊依次拿走 1 或 2 個(gè)硬幣,直...
摘要:解法真的非常巧妙,不過(guò)這道題里仍要注意兩個(gè)細(xì)節(jié)。中,為時(shí),返回長(zhǎng)度為的空數(shù)組建立結(jié)果數(shù)組時(shí),是包括根節(jié)點(diǎn)的情況,是不包含根節(jié)點(diǎn)的情況。而非按左右子樹(shù)來(lái)進(jìn)行劃分的。 Problem The thief has found himself a new place for his thievery again. There is only one entrance to this area,...
摘要:遍歷整個(gè)數(shù)組,用一個(gè)計(jì)數(shù)器,找出超過(guò)整個(gè)數(shù)組長(zhǎng)度二分之一的那個(gè)數(shù)。規(guī)則是當(dāng)前數(shù)等于,計(jì)數(shù)器加否則,計(jì)數(shù)器減。當(dāng)?shù)拇笮〉扔跁r(shí),統(tǒng)計(jì)中所有的,并將所有對(duì)應(yīng)的減,若被減為,就從中移除這對(duì)鍵值。 Majority Number I Problem Given an array of integers, the majority number is the number that occurs ...
閱讀 1408·2023-04-26 01:58
閱讀 2282·2021-11-04 16:04
閱讀 1753·2021-08-31 09:42
閱讀 1765·2021-07-25 21:37
閱讀 1066·2019-08-30 15:54
閱讀 2074·2019-08-30 15:53
閱讀 3047·2019-08-29 13:28
閱讀 2687·2019-08-29 10:56