动态规划-硬币排成线

动态规划-硬币排成线

  • 1 描述
  • 2 样例
    • 2.1 样例 1:
    • 2.2 样例 2:
    • 2.3 样例 3:
  • 3 算法解题思路及实现
    • 3.1 算法解题分析
      • 3.1.1 确定状态
      • 3.1.2 转移方程
      • 3.1.3 初始条件和边界情况
      • 3.1.4 计算顺序
    • 3.2 算法实现
      • 3.2.1 动态规划常规实现
      • 3.2.2 动态规划滚动数组

该题是lintcode的第394题, https://www.lintcode.com/problem/394/,解题思路参考九章侯老师给的建议。

1 描述

有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。

请判定 先手玩家 必胜还是必败?

若必胜, 返回 true, 否则返回 false.

Lintcode超级VIP年卡 618预售 享买一年送一年

微信加【jiuzhang1104】备注【VIP】即可参加

2 样例

2.1 样例 1:

输入: 1
输出: true

2.2 样例 2:

输入: 4
输出: true
解释:
先手玩家第一轮拿走一个硬币, 此时还剩三个.
这时无论后手玩家拿一个还是两个, 下一次先手玩家都可以把剩下的硬币拿完.

2.3 样例 3:

输入: 5
输出: true
解释:
先手玩家第一轮拿走两枚硬币, 此时还剩三个.
这时无论后手玩家拿一个还是两个, 下一次先手玩家都可以把剩下的硬币拿完.

3 算法解题思路及实现

3.1 算法解题分析

3.1.1 确定状态

这是一个博弈型动态规划类算法题,这中类型的算法解题分析不是从最后一步分析,而是从第一步分析,原因是随着硬币的减少,问题越来越简单。
假设两名选手分别为A和B,A为硬币为N时的先手,而当A拿走一或则两枚硬币之后,B则成为剩余硬币的先手,因此A要保证在自己拿走1或者2枚硬币的时候至少有一种情况是可以赢的。
子问题就转换为:
面对N枚硬币,A作为先手是不是必胜,
则需要知道面对N - 1和N - 2枚硬币B作为先手是不是必胜,
状态:设f[i]表示面对i个石子,是否先手必胜f[i] = True/False

3.1.2 转移方程

状态:设f[i]表示面对i个石子,是否先手必胜f[i] = True/False
在这里插入图片描述

f[i] = (f[i-1] == FALSE OR f[i-2] == FALSE)

3.1.3 初始条件和边界情况

  • 设f[i]表示面对i个石子,是否先手必胜f[i] = True/False
  • f[i] = (f[i-1] == FALSE OR f[i-2] == FALSE)
  • f[0] = FALSE 面对0枚硬币,先手必败
  • f[1] = f[2] = True, 面对1枚或2枚硬币,先手必胜

3.1.4 计算顺序

  • f[0], f[1], f[2], …, f[N]
  • 如果f[N] = true,则先手必胜,否则先手必败
  • 时间负责度为O(N)
  • 空间复杂度为:O(N)

3.2 算法实现

3.2.1 动态规划常规实现

public class Solution {
    /**
     * @param n: An integer
     * @return: A boolean which equals to true if the first player will win
     */
    public boolean firstWillWin(int n) {
        // write your code here
        if (n <= 0) {
            return false;
        }

        if (n <= 2) {
            return true;
        }

        boolean [] f = new boolean[n + 1];
        f[0] = false;
        f[1] = true;

        for (int i = 2; i <= n; i++) {
            f[i] = (!f[i - 1] || !f[i - 2]);
        }

        return f[n];
    }
}

3.2.2 动态规划滚动数组

public class Solution {
    /**
     * @param n: An integer
     * @return: A boolean which equals to true if the first player will win
     */
    public boolean firstWillWin(int n) {
        // write your code here
        if (n <= 0) {
            return false;
        }

        if (n <= 2) {
            return true;
        }

        boolean [] f = new boolean[2];
        f[0] = false;
        f[1] = true;

        for (int i = 2; i <= n; i++) {
            f[i % 2] = !(f[(i -1) % 2] && f[(i - 2) % 2]);
        }

        return f[n % 2];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在简历上写了“精通”后,我差点被面试官问到窒息....

前言 如果有真才实学&#xff0c;写个精通可以让面试官眼前一亮&#xff01; 如果是瞎写&#xff1f;基本就要被狠狠地虐一把里&#xff01; 最近在面试&#xff0c;我现在十分后悔在简历上写了“精通”二字… 先给大家看看我简历上的技能列表&#xff1a; 熟悉软件测试理…

基于相位共轭法的散射聚焦成像研究-Matlab代码

▒▒本文目录▒▒ 一、引言二、相位共轭法散射聚焦成像Matlab仿真三、参考文献四、Matlab程序开发与实验指导 一、引言 一直以来&#xff0c;研究人员致力于分析造成散射的原因、随机介质性质以及各种散射光的特征&#xff0c;并且研究透过散射介质成像。1990年&#xff0c;I.…

基于VMD-SSA-LSTM的多维时序光伏功率预测

目录 1 主要内容 变分模态分解(VMD) 麻雀搜索算法SSA 长短期记忆网络LSTM 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测【核心部分复现】&#xff0c;该程序预测效果比较好&#xff0c;并且结构比较清晰&#x…

新能源汽车充电桩的建设及优化分析

安科瑞虞佳豪 新能源汽车充电桩在经历了几年的发展之后&#xff0c;总体情况是在持续走好的&#xff0c;并且充电桩的建设相较于以往有了很大的普及度和安全度&#xff0c;这对新能源汽车车主是一个好事&#xff0c;也鼓励了更多人选择买新能源汽车&#xff0c;但这并不是说新…

如何通过控制点或地物点生产地方坐标系的倾斜摄影三维模型数据?

如何通过控制点或地物点生产地方坐标系的倾斜摄影三维模型数据&#xff1f; 要生成地方坐标系的倾斜摄影三维模型数据&#xff0c;需要进行以下步骤&#xff1a; 1、收集影像数据 首先需要采集大量的航空影像和地面影像&#xff0c;以构建真实世界中的物体模型。这些影像可以…

一文让你明白软件测试该怎样入门?

我认为入门软件测试需要四个方面的知识or技能&#xff0c;它们是&#xff1a;业务知识、职业素养、基础知识、技术知识。 职业素养是一切的根基&#xff0c;因为人在职场就必须拥有必要的职业素养&#xff0c;软件测试工程师也不例外。基础知识和技术知识是两大支柱&#xff0…

使用外部工具横向移动

Smbexe、Psexec Psexec PsExec是一种轻巧的telnet代替品&#xff0c;可让您在其他系统上执行进程&#xff0c;并为控制台应用提供完整的交互性&#xff0c;无需手动安装客户端软件。 原理&#xff1a; 1、ipc$连接&#xff0c;释放Psexesvc.exe 2、OpenSCManager打开受害者…

不甘做小弟,JS时间对象又在搞事情!(上)

关注“大前端私房菜”微信公众号&#xff0c;回复暗号【面试宝典】即可免费领取107页前端面试题。 Date Date 是 js 的一个内置对象&#xff0c;也叫内置构造函数。提供了一堆的方法帮助我们更方便的操作时间 创建时间对象&#xff1a;new Date() 获取时间对象&#xff1a;ne…

Flask-蓝图

1、使用步骤&#xff1a; 创建蓝图 blue Blueprint("myblue01", __name__) 使用蓝图装饰视图函数 blue.route(/) def index():return index 将蓝图注册到app中 from appdemo_blueprint import blue app.register_blueprint(blue) 2、以包的形式使用蓝图 <…

Java版企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

2023年4月和5月随笔

1. 回头看 为了不耽误学系列更新&#xff0c;4月随笔合并到5月。 日更坚持了151天&#xff0c;精读完《SQL进阶教程》&#xff0c;学系统集成项目管理工程师&#xff08;中项&#xff09;系列更新完成。 4月和5月两月码字114991字&#xff0c;日均码字数1885字&#xff0c;累…

如何将完成的报告从 FastReport .NET 导出到 S3

FastReport .NET 报表生成器FastReport .NET是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体的全功能报告库。使用FastReport .NET&#xff0c;您可以创建独立于应用程序的.NET报告。 简单存储服务是一种用于存储大量数据的服务。该服务将存储的数据划分…

解决spark程序 Permission denied: user=<username>, access=WRITE...等常见hive权限报错

Permission Denied Permission Denied: 这是最常见的错误消息之一&#xff0c;表示当前用户没有足够的权限执行写入操作。报错信息可能类似于&#xff1a; org.apache.hadoop.security.AccessControlException: Permission denied: user<username>, accessWRITE, inode&…

移动端的加解密

目录 引言 算法分类 密钥介绍 模式介绍 算法介绍 小结 写在最后 引言 今天给大家分享一篇有关移动端加解密的文章。随着移动设备的普及&#xff0c;加密技术在保护用户数据方面变得越来越重要。 本文将为您介绍Android加解密算法的分类、优缺点特性及应用&#xff0c;…

正确认识糖化学试剂:120173-57-1,Fmoc-Ser(Ac3GalNAcα)-OH的参数和保存方法

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ 【中文名称】N-芴甲氧羰基-O-(2-乙酰氨基-3,4,6-三-O-乙酰基-2-脱氧-α-D-吡喃半乳糖基)-L-丝氨酸 【英文名称】 Fmoc-Ser(Ac3GalNAcα)-OH 【结 构 式】 【CAS号】120173-…

线程的start方法剖析

线程的start方法剖析 public synchronized void start() {if (threadStatus&#xff01;0)throw new IllegalThreadStateException();group.add(this);boolean started false;try {start0();started true;} finally {try {if (&#xff01;started){group.threadStartFailed…

00后求你善良,不要这么卷了...

前几天我们公司一下子也来了几个新人&#xff0c;这些年前人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年春招结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#…

MySQL索引事务(一)

1、索引 1.1、概念 索引相当于一种特殊文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引类型&#xff0c;各类索引各自的结构实现。 1.2、作用 *通俗来讲&#xff0c;索引就相当于是我们的书本目录&#xff0c;…

[LeetCode周赛复盘] 第 348场周赛20230604

[LeetCode周赛复盘] 第 348场周赛20230604 一、本周周赛总结6462. 最小化字符串长度1. 题目描述2. 思路分析3. 代码实现 6424. 半有序排列1. 题目描述2. 思路分析3. 代码实现 6472. 查询后矩阵的和1. 题目描述2. 思路分析3. 代码实现 6396. 统计整数数目1. 题目描述2. 思路分析…

echarts的y轴数据显示过长占不下,内容截取,鼠标hover上去显示全部

初始效果&#xff1a; 优化后的效果&#xff1a; 优化点&#xff1a;控制了y轴显示字数&#xff0c;鼠标hover上去显示全部 主要实现思路参考了这位同学的文章&#xff1a;https://www.cnblogs.com/liuboren/p/9040622.html 我是用vue实现的&#xff0c;因为我需要一个页面中…