硬币排成线-LintCode
描述
有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。
请判定 先手玩家 必胜还是必败?
题目链接:https://www.lintcode.com/problem/394/
方法一:递归
#include "iostream"
using namespace std;
bool s(int n);
bool f(int n){//如果剩下1或者2个硬币,先手赢。if(n == 1 || n == 2){return true;}//先手可能拿一个或两个,如果后手拿完返回有一个是true,那么先手赢。return s(n - 1) || s(n - 2);
}
bool s(int n){//如果剩下1或者2个硬币,先手赢。if(n == 1 || n == 2){return false;}//后手可能拿一个或两个,如果先手拿完返回有一个是false,那么后手赢return f(n - 1) && f(n - 2);
}
int main(){int n;cin >> n;cout << f(n) << endl;
}
方法二:dp,时间复杂度(O(n))
class Solution {public:/*** @param n: An integer* @return: A boolean which equals to true if the first player will win*/bool firstWillWin(int n) {// write your code hereif(n == 0){return false;}int f[n + 1];int s[n + 1];f[1] = true;f[2] = true;s[1] = false;s[2] = false;for(int i = 3; i <= n; i++){f[i] = s[i - 1] || s[i - 2];s[i] = f[i - 1] && f[i - 2];}return f[n];}
};
方法三:发现规律,时间复杂度(O(1))
class Solution {public:/*** @param n: An integer* @return: A boolean which equals to true if the first player will win*/bool firstWillWin(int n) {// write your code herereturn !(n % 3 == 0);}
};
硬币排成线-LintCode相关推荐
- 面试题之硬币排成线java极简解法
问题描述:有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? 该题为一道典型的动态规划题,但此处 ...
- java 行为参数化_Java中的行为参数化
java 行为参数化 The past isn't here anymore, the future cannot be seen and the only thing permanent is th ...
- leetcode lintcode python
目录 1.Two Sum(Hash Table) Given an array of integers,return indices of the two numbers such that they ...
- oracle数据库批量操作系统,Oracle批量操作数据库
[转]ASP.NET MVC学习笔记-Controller的ActionResult 1. 返回ViewResult public ActionResult Index() { Vie ...
- 九章算法高频算法题 题解
专栏 | 九章算法 网址 | http://www.jiuzhang.com Google 面试题: Google 面试题 | 目标和 Google 面试题 | 建邮局 Google 面试题 | 0与 ...
- 天池在线编程 2020年9月26日 日常周赛题解
文章目录 1. K步编辑 2. 折纸 3. 字符串的不同排列 4. 硬币排成线 题目地址,请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target),输出所有可以经过不 ...
- LintCode 题解 |Google 面试题:Take Coins
题目描述 有n个硬币排成一排,每次要你从最左边或者最右侧拿出一个硬币.总共拿k次.写一个算法,使能拿到的硬币的和最大. 思路点拨 将list的前缀和求出来,然后依次枚举右边取x个,那么剩下就是左边去k ...
- Educoder实验五硬币抽选问题
任务说明 本关任务:编写动态规划法算法,求解硬币抽选问题. 相关知识 为了完成本关任务,你需要了解实验目的和实验内容. 实验目的 (1)熟悉动态规划法的基本设计思想. (2)掌握动态方程的推导过程. ...
- CleanCodeHandbook Chapter 8: Dynamic Programming(42-47)
Dynamic Programming 文章目录 Dynamic Programming leetcode70.Climbing Stairs leetcode62. Unique Paths lee ...
最新文章
- 原创 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军
- 再见,HttpClient!再见,Okhttp!
- grep,但只有特定的文件扩展名
- 大数据学习——MapReduce学习——字符统计WordCount
- storm后台启动命令(避免新开窗口)
- 解读浮动闭合最佳方案:clearfix
- java 省市区三级联动_AJAX省市区三级联动下拉菜单(java版)
- java生成pdf417_生成PDF417的JAVA包.rar
- 【es】es 的 Setting和Environment
- bartender实现即扫即打印功能扫描完后自动打印_日本彩色激光打印机推荐人气排名15款...
- .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern
- H5 --力导向图、关系图谱
- HDU2048 神、上帝以及老天爷【递推】
- 机器视觉硬件之工业相机(一)
- 饥荒联机版服务器搭建_饥荒联机版steam专用服务器快速搭建教程
- Processor Architecture: CISC, RISC, VLIW
- css中“~”(波浪号)、“,”(逗号)、“+”(加号)和“”(大于号)详解
- 代码健壮性的几点思考
- 从校园人到职业人的转变
- 人工神经网络的算法原理,神经网络算法的原理是
热门文章
- mysql的load data_【MySQL】load data语句详解(一)
- 【L2-040 哲哲打游戏】天梯赛L2题集
- 月薪8000的出租车司机给我上了震撼一课...
- python新手代码
- SD Formatter
- JavaWeb开发调用支付宝接口实现在线支付(整个支付过程从头到尾)
- Twitter实现每秒处理3000张(20G)图片的优化实践
- 关于无线通信的简单理解
- 性能测试——深圳个贷营销项目出差总结
- windows“找不到msvcp120.dll ”或“msvcp120.dll 缺失