摘要:兩個參賽者輪流從左邊依次拿走或個硬幣,直到沒有硬幣為止。計算兩個人分別拿到的硬幣總價值,價值高的人獲勝。請判定第一個玩家是輸還是贏樣例給定數組返回給定數組返回復雜度思路考慮先手玩家在狀態,表示在在第的硬幣的時候,這一位玩家能拿到的最高價值。
LintCode Coins in a line II
dp有 n 個不同價值的硬幣排成一條線。兩個參賽者輪流從左邊依次拿走 1 或 2 個硬幣,直到沒有硬幣為止。計算兩個人分別拿到的硬幣總價值,價值高的人獲勝。
請判定 第一個玩家 是輸還是贏?
樣例
給定數組 A = [1,2,2], 返回 true.
給定數組 A = [1,2,4], 返回 false.
復雜度
O(N)
思路
考慮先手玩家在狀態dp[i],dp[i]表示在在第i的硬幣的時候,這一位玩家能拿到的最高價值。
如果先手玩家取一枚硬幣,那么dp[i] = values[i] + sum[i + 1] - dp[i + 1]。減去dp[i + 1]的原因是,對手玩家,每次也要想辦法拿到最大的價值,所以先手玩家能拿到的價值是在對手玩家拿到最大價值的硬幣之后的剩余的硬幣價值。
如果先手玩家取兩枚,那么dp[i] = values[i] + values[i + 1] + sum[i + 2] - dp[i + 2];
注意判斷是否先手玩家贏的條件,是2倍dp[0]的值是不是大于sum[0],應為是要求拿到硬幣價值多的玩家算贏。
代碼
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
復雜度
O(N),O(N)
思路
思路是一樣,不過是從bottom-up的算法,用map來保存已經搜索過的路線。
代碼
Mapmap = 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; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65257.html
摘要:復雜度思路參考的思路,對于,表示在從到的范圍內,先手玩家能拿到的最大的硬幣價值。對于狀態,先手玩家有兩種選擇,要么拿的硬幣,要么拿的硬幣左邊一個的或者右邊一側的,如果拿左側的硬幣,如果拿右側的硬幣,取兩個值的最大值。 LintCode Coins in a line III There are n coins in a line. Two players take turns to ...
摘要:第一個游戲者永遠拿不到第枚硬幣,所以在硬幣總數不能被整除的情況下,都可以贏。做法,設為第一個游戲者從第枚硬幣到能獲得硬幣價值的最大值。主要參考這篇文章的解釋 Coins in a Line I Solution 第一個游戲者永遠拿不到第3n枚硬幣,所以在硬幣總數不能被3整除的情況下,都可以贏。 public class Solution { public boolean fi...
摘要:有個硬幣排成一條線。兩個參賽者輪流從右邊依次拿走或個硬幣,直到沒有硬幣為止。拿到最后一枚硬幣的人獲勝。表示的是,當有個棋子的時候,先手玩家會不會輸。贏得條件是,和的狀態是輸的狀態。 LintCode: coins in a line I 有 n 個硬幣排成一條線。兩個參賽者輪流從右邊依次拿走 1 或 2 個硬幣,直到沒有硬幣為止。拿到最后一枚硬幣的人獲勝。 請判定 第一個玩家 是輸還...
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 ...
摘要:和唯一的不同是組合中不能存在重復的元素,因此,在遞歸時將初始位即可。 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...
閱讀 3952·2021-11-11 10:58
閱讀 3321·2021-09-26 09:46
閱讀 1912·2019-08-30 15:55
閱讀 976·2019-08-30 13:52
閱讀 1944·2019-08-29 13:11
閱讀 3024·2019-08-29 11:27
閱讀 1517·2019-08-26 18:18
閱讀 2619·2019-08-23 14:17