lintcode 中等题:Coins in Line II 硬币排成线 II
来源:互联网 发布:淘宝网hd下载 编辑:程序博客网 时间:2024/05/24 05:03
转自博客,侵删。
题目
硬币排成线 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] 或者values[i+1] + values[i+2]
当对方取values[i+1] 后 ,我们只能从 i+2 到end内取,我们所取得最大值是dp[i+2], 注意:对方所选取的结果一定是使得我们以后选取的值最小
当对方取values[i+1] + values[i+2]后,我们只能从i+3到end内取,我们所取得最大值是dp[i+3]。
此时:dp[i] = values[i] + min(dp[i+2],dp[i+3]) , 注意:对方所选取的结果一定是使得我们以后选取的值最小
2.若取values[i] + values[i+1],对方可取values[i+2] 或者values[i+2] + values[i+3]
当对方取values[i+2]后,我们只能从i+3到end内取,我们取得最大值是dp[i+3]
当对方取values[i+2]+values[i+3]后,我们只能从i+4到end内去,我们取得最大值是dp[i+4]
此时:dp[i] = values[i] + values[i+1]+min(dp[i+3],dp[i+4])
这里的取最小值和上面一样的意思,对方选取过之后的值一定是使得我们选取的值最小,对方不傻并且还很聪明
最后我们可以取上面两个dp[i]的最大值,就是答案,这里意思是:对方留得差的方案中,我们选取的最大值。
代码:
public class Solution { /** * @param values: an array of integers * @return: a boolean which equals to true if the first player will win */ public boolean firstWillWin(int[] values) { // write your code here // dp 表示从i到end 的最大值 // int values[] ={1,2,4,3,4,8,5,6,12}; int len = values.length; // 长度小于2的时候第一个人一定获胜 if(len <= 2) return true; int dp[] = new int[len+1]; dp[len] = 0; dp[len-1] = values[len-1]; dp[len-2] = values[len-1] + values[len - 2]; dp[len - 3] = values[len-3] + values[len - 2]; for(int i = len -4;i>=0;i--){ dp[i] = values[i] + Math.min(dp[i+2],dp[i+3]); dp[i] = Math.max(dp[i],values[i]+values[i+1]+ Math.min(dp[i+3],dp[i+4])); } int sum = 0; for(int a:values) sum +=a; return dp[0] > sum - dp[0]; }}
- lintcode 中等题:Coins in Line II 硬币排成线 II
- lintcode coins-in-a-line-ii 硬币排成线ii
- lintcode Coins in Line II 硬币排成线 II
- 395.Coins in a Line II-硬币排成线 II(中等题)
- lintcode coins-in-a-line 硬币排成线
- 394.Coins in a Line-硬币排成线(中等题)
- LintCode-硬币排成线 II
- LintCode :硬币排成线 II
- [LintCode]硬币排成线 II
- LintCode 硬币排成线 II
- 硬币排成线 II-LintCode
- LintCode:M-硬币排成线 II
- Coins in a line II lintcode
- [LintCode] Coins in a line II
- **[Lintcode]Coins in a Line II
- 硬币排成线 II
- 硬币排成线 II
- 硬币排成线I和硬币排成线II问题
- 第3周项目1--顺序表的基本运算(1)
- java Maven 配置
- JPA EntityManager的四个主要方法:persist,merge,refresh和remove
- JTA 深度历险
- leetcode Majorty Element
- lintcode 中等题:Coins in Line II 硬币排成线 II
- 心无旁骛 目标明确
- Hadoop+yarn搭建
- 第三周-项目二 建立自己的算法库
- DB2存储过程中的异常处理
- Mac下Terminal路径显示配置
- 数组中出现次数最多的数及出现次数
- hiho一下第167周数组重排
- s1s3h3框架整合插入数据报错 No value specified for parameter 3 id没有自动生成