变型:如果是最后拿走所有石子那个人输,则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. MINST样例数据的神经网络学习

    标准的入门学习示例, 比一年前看的那书,更有感觉了. # coding: utf-8 try: import urllib.request except ImportError: raise Impo ...

  2. 在linux上安装python

    转自:https://www.cnblogs.com/qq631243523/p/10191726.html 一,前言 centos7默认是装有python的,咱们先看一下 [root@glh ~ 2 ...

  3. LGOJP1941 飞扬的小鸟

    题目链接 题目链接 题解 \(f[i][j]\)表示位置\((i,j)\)到达需要的最小点击数. \(f[i][j]=\min\{{f[i-1][j-kx]+k},f[i-1][j+y]\}\) \( ...

  4. JDK源码那些事儿之ConcurrentLinkedDeque

    非阻塞队列ConcurrentLinkedQueue我们已经了解过了,既然是Queue,那么是否有其双端队列实现呢?答案是肯定的,今天就继续说一说非阻塞双端队列实现ConcurrentLinkedDe ...

  5. js中string常用方法

    charAt(index) 用于返回指定位置的字符,index从0开始计算 concat(string1,string2..),用于字符串拼接: indexOf():用于返回指定字符在字符串中第一次出 ...

  6. css 为什么给span加vertical-align: middle不起作用?

    vertical-align是什么意思?先举个例子! 这句html元素中的文本为什么不能垂直居中. <style> span{ height:60px;vertical-align: mi ...

  7. CentOS6.5 安装ES5.5

    一.CURL查看已开启的ES es5.5:elasticsearch-5.5.2.tar.gz下载,百度云地址 https://pan.baidu.com/s/17oFOQlePLtUhhJHxEPR ...

  8. Linux环境下面安装Perl环境

    1.下载安装 wget http://www.cpan.org/src/5.0/perl-5.26.1.tar.gz tar zxvf perl-5.26.1.tar.gz cd perl-5.26. ...

  9. Vijos 1057 盖房子

    二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), ...

  10. Android精通教程-Android入门简介

    前言 大家好,我是 Vic,今天给大家带来Android精通教程-Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease ...