有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。

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

n = 1, 返回 true.
n = 2, 返回 true.
n = 3, 返回 false.
n = 4, 返回 true.
n = 5, 返回 true.

解法:DP, 复杂度 O(N), O(N)

最少是n = 3时,返回false,说明当一个player面临只有3个棋子的时候,他肯定会输。
dp[i]表示的是,当有i个棋子的时候,先手玩家会不会输。dp[i]这个状态可以由dp[i - 1]或者dp[i - 2]跳过来。dp[i]赢得条件是,dp[i - 1]和dp[i - 2]的状态是输的状态。

可以优化空间复杂度到O(1)。

Java:

public boolean firstWillWin(int n) {
boolean[] dp = new boolean[n + 1];
for(int i = 1; i <= n; i ++) {
if(i == 1 || i == 2) dp[i] = true;
else dp[i] = !dp[i - 1] || !dp[i - 2];
}
return dp[n];
}

 

类似题目:

[LintCode] Coins in a line II

 

最新文章

  1. 数据库的NULL值讨论
  2. ios界面布局整理
  3. java 的常用设计模式--大话设计模式
  4. VS2010下 LibVLC开发环境搭建
  5. AutoHotKey 脚本集中营(一)
  6. Android编译过程详解(一)
  7. leecode 每日解题思路 102-Binary Tree Level Order Traversal
  8. spoj 1557 GSS3 - Can you answer these queries III 线段树
  9. netconf、yang和XML关系
  10. linux系统性能监控--内存利用率
  11. render_template 网页模板
  12. BroadcastReceiver工作原理
  13. JavaWeb基础-servlet
  14. MyBatis——模糊查询
  15. android studio 添加get,set方法快捷方式
  16. try catch对Spring事务的影响
  17. Android MPAndroidChart LineChart 显示数据格式化
  18. python学习读取配置文件
  19. 用 Python 实现一个大数据搜索引擎
  20. Scala进阶之App特质

热门文章

  1. 【一起来烧脑】一步Sass学会体系
  2. xftp实现本地与服务器的文件上传下载(windows)
  3. Codeforces Round #383 D
  4. Tkinter 之TreeView表格与树状标签
  5. 实现一个兼容eleUI form表单的多选组件
  6. 登录科普(一)CAS与Oauth
  7. 【微信小程序】scroll-view 的上拉加载和下拉刷新
  8. 在JAVA中怎么比较Double类型数据的大小
  9. 查看 systemctl 崩溃日志 及 运行日志
  10. shell - 拉取代码部署执行