变型:如果是最后拿走所有石子那个人输,则f[0] = true

394. Coins in a Line

dp[n]表示n个石子,先手的人,是必胜还是必输。拿1个石子,2个石子之后都是必胜,则当前必败;拿1个石子,2个石子之后都是必败,则当前必胜;如果拿1个石子,2个石子之后有必败,则当前必胜。

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 here
if(n == )
return false;
if(n == )
return true;
vector<int> dp(n+);
dp[] = false,dp[] = true;
for(int i = ;i <= n;i++){
if(dp[i-] == true && dp[i-] == true)
dp[i] = false;
else if(dp[i-] == false && dp[i-] == false)
dp[i] = true;
else
dp[i] = dp[i-] || dp[i-];
}
return dp[n];
}
};

292. Nim Game

这个题几乎与Coins in a Line一模一样。

解法一:

这个解法超内存了

class Solution {
public:
bool canWinNim(int n) {
if(n == )
return false;
if(n == || n == )
return true;
vector<int> dp(n+);
dp[] = false,dp[] = true,dp[] = true;
for(int i = ;i <= n;i++){
if(dp[i-] == true && dp[i-] == true && dp[i-] == true)
dp[i] = false;
else if(dp[i-] == false && dp[i-] == false && dp[i-] == false)
dp[i] = true;
else
dp[i] = true;
}
return dp[n];
}
};

解法二:

因为只与前3个有关系,所以用变量替代,能不超内存,但超时了

class Solution {
public:
bool canWinNim(int n) {
if(n == )
return false;
if(n == || n == )
return true;
bool num1 = false,num2 = true,num3 = true;
for(int i = ;i <= n;i++){
bool tmp;
if(num1 == true && num2 == true && num3 == true){
tmp = false;
}
else
tmp = true;
num1 = num2;
num2 = num3;
num3 = tmp;
}
return num3;
}
};

解法三:

class Solution {
public:
bool canWinNim(int n) {
return n% ? true : false;
}
};

395. Coins in a Line II

https://www.cnblogs.com/grandyang/p/5864323.html

与Coins in a Line相同的是,这个题每次也只能拿一个或者两个。不同的是,最终的胜负是谁拥有的金币的价值更多。

dp[i]表示从i到end可取的最大钱数

如果取一个,dp[i] = values[i] + min(dp[i+2],dp[i+3])

如果取两个,dp[i] = values[i] + values[i+1] + min(dp[i+3],dp[i+4])

所以最终的递归就是dp[i] = max(values[i] + min(dp[i+2], dp[i+3]), values[i] + values[i + 1] + min(dp[i+3], dp[i+4]))

代码实际上是可以解决n = 1和n = 2的情况,只是因为n-2,n-3这种会造成越界的错误。

class Solution {
public:
/**
* @param values: a vector of integers
* @return: a boolean which equals to true if the first player will win
*/
bool firstWillWin(vector<int> &values) {
// write your code here
int n = values.size();
if(n <= )
return true;
vector<int> dp(n+,);
dp[n-] = values[n-];
dp[n-] = values[n-] + values[n-];
dp[n-] = values[n-] + values[n-];
for(int i = n - ;i >= ;i--)
dp[i] = max(values[i] + min(dp[i+],dp[i+]),values[i] + values[i+] + min(dp[i+],dp[i+]));
int sum = ;
for(int i = ;i < n;i++)
sum += values[i];
return dp[] > sum - dp[];
}
};

lintcode 394. Coins in a Line 、leetcode 292. Nim Game 、lintcode 395. Coins in a Line II的更多相关文章

  1. Java实现 LeetCode 292 Nim游戏

    292. Nim 游戏 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解 ...

  2. 【算法功底】LeetCode 292 Nim Game

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...

  3. LeetCode 292. Nim Game (取物游戏)

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...

  4. LeetCode 292 Nim Game(Nim游戏)

    翻译 你正在和你的朋友们玩以下这个Nim游戏:桌子上有一堆石头.每次你从中去掉1-3个.谁消除掉最后一个石头即为赢家.你在取出石头的第一轮. 你们中的每个人都有着聪明的头脑和绝佳的策略.写一个函数来确 ...

  5. leetcode 292. Nim游戏(python)

    你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函数,来判断 ...

  6. LeetCode 292. Nim Game

    Problem: You are playing the following Nim Game with your friend: There to stones. The one who remov ...

  7. Leetcode 292 Nim Game 博弈论

    class Solution {public:    bool canWinNim(int n) {        return n % 4 != 0;    }};

  8. LN : leetcode 292 Nim Game

    lc 292 Nim Game 292 Nim Game You are playing the following Nim Game with your friend: There is a hea ...

  9. Java [Leetcode 292]Nim Game

    问题描述: You are playing the following Nim Game with your friend: There is a heap of stones on the tabl ...

随机推荐

  1. MySQL线程状态详解

    前言: 我们常用 show processlist 或 show full processlist 查看数据库连接状态,其中比较关注的是 State 列,此列表示该连接此刻所在的状态.那么你真的了解不 ...

  2. Java精通并发-锁升级与偏向锁深入解析

    对于synchronized关键字,我们在实际使用时可能经常听说用它是一个非常重的操作,其实这个“重”是要针对JDK的版本来说的,如今JDK已经到了12版本了,其实对这个关键字一直是存在偏见的,它底层 ...

  3. linux网络编程之socket编程(一)

    今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp ...

  4. 牛客NOIP暑期七天营-提高组1 解题报告

    https://ac.nowcoder.com/acm/contest/920#question A 构造+双指针 发现m的限制是1e5,而点数是5e4,所以不能构造太多的边,思考一下最短路树的定义. ...

  5. 《CoderXiaoban》第九次团队作业:Beta冲刺与验收准备1

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十三 团队作业9:BETA冲刺与团队项目验收 团队名称 Coderxiaoban团队 作业学习目标 (1)掌握软件黑盒 ...

  6. 关于C3P0-mySQL关于url的细节问题

    1.为url设置?useUnicode=true&characterEncoding=UTF-8 为了统一编码,我们会为数据库封装的实体类加上上面的那句话,但是C3P0数据库连接池是xml配置 ...

  7. Linux入门——安装jdk、tomcat、MySQL以及项目部署

    Linux简介     Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务. 支持多线程和多CPU的操作系统.伴随着互联网的发展,     Linu ...

  8. Linux 一款免费的shell工具 MobaXterm_Personal

    一款免费的shell工具 MobaXterm_Personal

  9. 06.volatile关键字

    volatile volatile关键字的主要作用是使变量在多个线程间可见 使用方法: private volatile int number=0; 图示: 两个线程t1和t2共享一份数据,int a ...

  10. 【JS】基础知识

    引言 在互联网的演化过程中,网页制作是Web1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主. 2005年以后,互联网进入了Web2.0时代,各类似桌面软件的Web应用大 ...