描述
有 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相关推荐

  1. 面试题之硬币排成线java极简解法

    问题描述:有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? 该题为一道典型的动态规划题,但此处 ...

  2. java 行为参数化_Java中的行为参数化

    java 行为参数化 The past isn't here anymore, the future cannot be seen and the only thing permanent is th ...

  3. leetcode lintcode python

    目录 1.Two Sum(Hash Table) Given an array of integers,return indices of the two numbers such that they ...

  4. oracle数据库批量操作系统,Oracle批量操作数据库

    [转]ASP.NET MVC学习笔记-Controller的ActionResult 1. 返回ViewResult public ActionResult Index()   {       Vie ...

  5. 九章算法高频算法题 题解

    专栏 | 九章算法 网址 | http://www.jiuzhang.com Google 面试题: Google 面试题 | 目标和 Google 面试题 | 建邮局 Google 面试题 | 0与 ...

  6. 天池在线编程 2020年9月26日 日常周赛题解

    文章目录 1. K步编辑 2. 折纸 3. 字符串的不同排列 4. 硬币排成线 题目地址,请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target),输出所有可以经过不 ...

  7. LintCode 题解 |Google 面试题:Take Coins

    题目描述 有n个硬币排成一排,每次要你从最左边或者最右侧拿出一个硬币.总共拿k次.写一个算法,使能拿到的硬币的和最大. 思路点拨 将list的前缀和求出来,然后依次枚举右边取x个,那么剩下就是左边去k ...

  8. Educoder实验五硬币抽选问题

    任务说明 本关任务:编写动态规划法算法,求解硬币抽选问题. 相关知识 为了完成本关任务,你需要了解实验目的和实验内容. 实验目的 (1)熟悉动态规划法的基本设计思想. (2)掌握动态方程的推导过程. ...

  9. CleanCodeHandbook Chapter 8: Dynamic Programming(42-47)

    Dynamic Programming 文章目录 Dynamic Programming leetcode70.Climbing Stairs leetcode62. Unique Paths lee ...

最新文章

  1. pytorch常用代码
  2. Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
  3. DataGrid分页使用小结
  4. bootstrap下拉列表与输入框组结合的样式调整
  5. Win2003下Exchange2003部署图解之二
  6. svn 合并分支代码到主干
  7. Golang 编程思维和工程实战
  8. 【译】Googler如何解决编程问题
  9. 索引-bootsrap
  10. ConfirmCancelUtilDialog【确认取消对话框封装类】
  11. 用Alamofire进行网络请求的一段代码解析(一)
  12. 18.mysql优化(三)–explain分析sql语句执行效率
  13. Effective C++ -----条款05:了解C++默默编写并调用哪些函数
  14. 华为MAGICBOOK安装win10专业版,华为MAGICBOOK win10专业版X64下载
  15. 基于Python的文字生成图片系统
  16. 安装黑苹果双系统小记(昂达B365+EFI)
  17. js通过开始时间和结束时间计算出中间的所有日期
  18. 学生学籍管理系统_管理员登陆对学生的信息进行操作
  19. GetDC和BeginPaint
  20. 使用Docker pull一些软件时,遇到某个id一直处于waiting的状态

热门文章

  1. Python 保留excel中原有数据,添加新的sheet页
  2. shell bash
  3. modelsim脚本仿真(二)带quartus的IP核工程仿真
  4. 华为发布全球首个全性能端到端HSDPA商用方案
  5. JAVA GUI文字游戏
  6. WPS 2007轻松插入特色页码
  7. 99物联 外接IPEX AFW125TO
  8. pps抽样matlab,抽样器,sampler,在线英语词典,英文翻译,专业英语
  9. 几个实用的Rpm包下载---Updating
  10. php urlencode()函数详解