LintCode: coins in a line I
2024-08-26 12:26:54
有 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];
}
类似题目:
最新文章
- 数据库的NULL值讨论
- ios界面布局整理
- java 的常用设计模式--大话设计模式
- VS2010下 LibVLC开发环境搭建
- AutoHotKey 脚本集中营(一)
- Android编译过程详解(一)
- leecode 每日解题思路 102-Binary Tree Level Order Traversal
- spoj 1557 GSS3 - Can you answer these queries III 线段树
- netconf、yang和XML关系
- linux系统性能监控--内存利用率
- render_template 网页模板
- BroadcastReceiver工作原理
- JavaWeb基础-servlet
- MyBatis——模糊查询
- android studio 添加get,set方法快捷方式
- try catch对Spring事务的影响
- Android MPAndroidChart LineChart 显示数据格式化
- python学习读取配置文件
- 用 Python 实现一个大数据搜索引擎
- Scala进阶之App特质