动态规划-硬币排成线

news2024/11/22 13:24:44

动态规划-硬币排成线

  • 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];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二十一章 开发Productions - ObjectScript Productions - 延迟发送

文章目录 第二十一章 开发Productions - ObjectScript Productions - 延迟发送延迟发送 生成事件日志条目在 ObjectScript 中生成事件日志条目 第二十一章 开发Productions - ObjectScript Productions - 延迟发送 延迟发送 除了同步&#xff08;等待&#xff09;和异步&…

9秒被骗245万元?AI火了,骗子也来了!

生成式AI技术&#xff0c;如GPT-4等强大的语言模型的广泛普及&#xff0c;已经逐步开展应用。这种对未来技术的期待之余&#xff0c;不得不面对AI技术可能被滥用的风险&#xff0c;甚至已经有一些犯罪分子已开始巧妙地利用AI技术进行电信诈骗。 当下最积极学习的除了学生&#…

【高危】Apache bRPC <1.5.0 存在任意代码执行漏洞

漏洞描述 Apache bRPC 是C开发、由百度RPC发展而来的工业级 RPC 框架。 该项目受影响版本存在任意代码执行漏洞&#xff0c;由于server.cpp对于用户输入的pid_file使用wordexp展开。 具备bRPC控制权限的攻击者可在bRPC启动时通过控制pid_file参数注入恶意内容&#xff08;如…

DNS隧道流量分析

1.域名准备 选择哪家的云都没问题&#xff0c;国内云需要实名&#xff0c;不建议使用&#xff0c;这里我选择的TX云&#xff0c;因为之前注册过了&#xff0c;自己拿来做个流量分析不成问题 域名添加解析记录 需要准备自己的vps作为DNS隧道的服务端&#xff0c;且需要添加ns…

.nc文件根据经纬度提取点上数值python

.nc文件根据经纬度提取点上数值python 1、数据集2、代码部分3、完整代码 1、数据集 VOD Climate Archive &#xff08;VODCA&#xff09; 数据由维也纳工业大学提供&#xff08;https://doi.org/ 10.5281/zenodo.2575599&#xff09;。VODCA是一种空间分辨率为0.25的全球每日V…

【十一】设计模式~~~结构型模式~~~代理模式(Java)

【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★★☆】 6.1. 模式动机 在某些情况下&#xff0c;一个客户不想或者不能直接引用一个对 象&#xff0c;此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起…

网络流量管理系统

网络监控对于当今的组织至关重要&#xff0c;该过程的一个关键方面是分析网络的正常运行时间、可用性、性能和安全性。随着云和物联网技术越来越多地成为现代 IT 环境的一部分&#xff0c;网络管理员必须更加警惕他们授予访问权限的流量&#xff0c;包括确定谁在使用他们的网络…

【十四】设计模式~~~行为型模式~~~中介者模式(Java)

【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★★★】 3.1. 模式动机 建立一种对象与对象之间的依赖关系&#xff0c;一个对象发生改变时将自动通知其他对象&#xff0c;其他对象将相应做出反应。在此&#xff0c;发生改变的对象称为观察目标&#…

提高测试效率5大捷径

1、优先级 测试任务和开发任务一样&#xff0c;都需要进行优先级排序。在测试工作中&#xff0c;优先进行级别高的测试任务&#xff0c;这样能够在无法保障测试周期的前提下&#xff0c;也不会对整体开发进度造成较大的影响。 提高测试效率5大捷径 2、重视测试策略 测试策略的基…

零代码,使用 Dify 两分钟接入企业微信

前置准备 企业微信的管理员权限 一个 Dify 的帐号 一个 Laf 云的帐号 &#xff08;可选&#xff09;一个 OpenAI 的 API Key。如果没有&#xff0c;可以使用 Dify 免费提供的 200 次调用机会用于测试。 &#xff08;可选&#xff09;在电脑上新建一个 env.txt 的文件&#…

C++进阶 —— 列表初始化(C++11新特性)

目录 一&#xff0c;列表初始化 二&#xff0c;类列表初始化 三&#xff0c;类模板列表初始化 库模板初始化列表实现 模拟模板初始化列表实现 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称&…

神经网络与机器学习

《神经网络与深度学习》 第一章 绪论1.1 人工智能知识结构预备知识顶会论文常用的深度学习框架研究领域 1.2 如何开发AIS芒果机器学习 1.3 表示学习局部表示和分布式表示 1.4 深度学习&#xff08;Deep Learning) 第一章 绪论 1.1 人工智能 人工智能的一个子领域 神经网络&a…

百度商业AI技术创新大赛火热进行中,携手专家大咖一起创新为更好!

百度商业AI技术创新大赛火热进行中 来自百度、中国人工智能学会 及NVIDIA的专家大咖纷纷送上寄语 希望与充满创新思维的年轻人一起 探讨AI技术的创新应用 挖掘AIGC在商业领域发展的更多可能 开启中国人工智能发展新篇章&#xff01; -戴琼海- 国务院参事 CAAI理事长 …

分布式锁的应用场景与分布式锁实现(三):基于Zookeeper实现分布式锁

分布式锁的应用场景与分布式锁实现&#xff08;二&#xff09;&#xff1a;基于Redis实现分布式锁 基于Zookeeper实现分布式锁 ​ 实现分布式锁目前有三种流行方案&#xff0c;分别为基于数据库、Redis、Zookeeper的方案。这里主要介绍基于zk怎么实现分布式锁。在实现分布式锁…

每日一题——重复的子字符串

每日一题 重复的子字符串 题目链接 注&#xff1a;本题的题解基本建立在KMP算法之上&#xff0c;对KMP算法不太了解的小伙伴可以参考这篇文章KMP算法及其改进图文详解 方法一&#xff1a;移动匹配 我们先来看几个可以由一个字串重复多次构成的主字符串&#xff1a;“aaa”&am…

chatgpt赋能Python-python人脸识别步骤

简介 Python是一种优秀的编程语言&#xff0c;它广泛应用于人工智能、数据科学、Web应用程序开发等领域。其中&#xff0c;人脸识别是Python应用程序中的重要一环。 本文将介绍Python人脸识别的具体步骤&#xff0c;希望对初学者有所帮助。 Python人脸识别步骤 安装必要的库…

销售管理全面指南:职能、流程、目标和工具

销售管理是优化公司销售队伍的过程&#xff0c;以有效利用现有资源来完成交易。对于任何依靠销售来推动收入的企业来说&#xff0c;这是绝对必要的。 销售管理可以细分为三个主要领域&#xff1a;销售运营、销售策略和销售分析。 根据美国营销协会&#xff08;AMA&#xff…

使用腾讯云短信服务实现Spring Boot短信发送

发送短信 01 注册微信公众号02 注册腾讯云账号03 创建签名和模板第一步 创建签名第二部 创建模板 04 发送短信 01 注册微信公众号 在百度中寻找微信公众平台&#xff0c;并在进入官网后注册。在账号注册过程中&#xff0c;需选择订阅号(个人)。注册成功后&#xff0c;请保存账…

我的浙大MEM提前批面试全流程重点信息梳理

浙江大学MEM已上岸&#xff0c;目前在读&#xff0c;给大家分享下我的备考经验&#xff0c;希望可以帮助到大家。 在确定自己的目标院校后收集相关信息是非常重要的&#xff0c;比如今年计划招多少学生&#xff0c;往年上岸都需要多少分&#xff0c;学费等情况&#xff0c;招考…

Kyligence x 集简云|无代码集成数百款应用,轻松打造数据产品

一站式指标平台 Kyligence Zen 现已支持对接集简云平台&#xff0c;企业无需繁琐的开发工作&#xff0c;即可无代码集成数百款应用&#xff0c;打破数据孤岛、统一数据口径&#xff0c;帮助企业实现数据的协作和分享&#xff0c;轻松进行数据分析、构建数据产品&#xff0c;助力…