lintcode 394. Coins in a Line 、leetcode 292. Nim Game 、lintcode 395. Coins in a Line II
变型:如果是最后拿走所有石子那个人输,则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的更多相关文章
- Java实现 LeetCode 292 Nim游戏
292. Nim 游戏 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 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 ...
- LeetCode 292. Nim Game (取物游戏)
You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...
- LeetCode 292 Nim Game(Nim游戏)
翻译 你正在和你的朋友们玩以下这个Nim游戏:桌子上有一堆石头.每次你从中去掉1-3个.谁消除掉最后一个石头即为赢家.你在取出石头的第一轮. 你们中的每个人都有着聪明的头脑和绝佳的策略.写一个函数来确 ...
- leetcode 292. Nim游戏(python)
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函数,来判断 ...
- LeetCode 292. Nim Game
Problem: You are playing the following Nim Game with your friend: There to stones. The one who remov ...
- Leetcode 292 Nim Game 博弈论
class Solution {public: bool canWinNim(int n) { return n % 4 != 0; }};
- 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 ...
- Java [Leetcode 292]Nim Game
问题描述: You are playing the following Nim Game with your friend: There is a heap of stones on the tabl ...
随机推荐
- jmeter性能测试监控
Jmeter监控服务器资源配置如下: 1.进入https://jmeter-plugins.org/downloads/all/下载plugins-manager.jar,放置到jmeter安装目录/ ...
- PAT_A1059
这是一道素数因子分解的问题: 1.先打印素数表出来,以便后期使用,素数表的大小就是10^5级别就可以,因为输入的数是long int(即就是int而已),大小最大21亿(10^10量级的),我们这里素 ...
- django-ContentType的简单使用
ContentType 一般我们有多张表同时外键关联同一张表的时候,可以考虑使用ContentType models.py from django.db import models from djan ...
- Bias vs. Variance(1)--diagnosing bias vs. variance
我们的函数是有high bias problem(underfitting problem)还是 high variance problem(overfitting problem),区分它们很得要, ...
- LINQ查询表达式(1) - 查询表达式基础
LINQ包括五个部分:LINQto Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML. 什么是查询?它有什么用途? “ ...
- 用Visio画流程图
一:基本流程图 主要用于创建流程图.顺序图.信息跟踪图.流程规划图和结构预测图,包含了形状.连接线和链接. 步骤: (1)打开Visio,单击"类别"->"流程图& ...
- 关于equals和hashcode问题
默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了e ...
- Appium环境搭建(Mac)
为什么选择Mac做自动化测试? 既可以做iOS端的测试也可以进行Android端测试 Mac运行效率相对于Win要高很多,可以真正发挥appium的功能 环境依赖 Node.js Appium App ...
- Oracle 重新编译存储过程/函数等
第一种 如果你使用 PL/SQL Developer工具 左侧工具栏中选择“存储过程”->选择已经失效的procedure->右键->选择重新编译 即可完成 第二 ...
- [转载]pythonnet
python与c#的交互模块pythonnethttp://www.cnblogs.com/tester-zhenghan/p/5406521.html [集成IronPython] 添加CLR对象到 ...