算法导论记录丨16.1 活动选择、877. 石子游戏

16.1 活动选择

最优子结构

活动选择问题的最优子结构意味着问题的最优解包含了其子问题的最优解。具体来说,如果我们有一个按结束时间排序的活动集合 S={a1​,a2​,...,an​},并且 S’ 是 S 的最大兼容活动子集,那么对于 S′ 中的任何活动aj​,S′ 也包含了在活动aj​ 之前结束的所有活动中的最大兼容子集。

这个属性允许我们使用贪心策略来构建解决方案,因为在选择了当前最优的活动之后,剩余的选择可以独立于已经做出的选择,并且仍然达到最优。

贪心策略

活动选择问题的贪心策略基于一个简单的原则:总是选择结束时间最早的活动,然后从剩余的与已选择活动不冲突的活动中继续应用这一策略。这种方法的有效性在于它能够最大化剩余时间,从而增加选择其他活动的机会。

  1. 排序:首先按照活动的结束时间对活动进行排序。
  2. 选择:选择结束时间最早的活动,并将其加入到最优解集合中。
  3. 剔除:移除与已选择活动时间上冲突的所有活动。
  4. 重复:重复步骤2和3,直到没有更多的活动可以选择。

Python 实现

迭代:
def activity_selection(activities):# 按结束时间对活动进行排序sorted_activities = sorted(activities, key=lambda x: x[1])# 选择第一个活动n = len(sorted_activities)last_selected = 0selected_activities = [sorted_activities[0]]# 遍历剩余的活动for i in range(1, n):# 如果当前活动的开始时间大于或等于上一个选择的活动的结束时间if sorted_activities[i][0] >= sorted_activities[last_selected][1]:# 选择当前活动selected_activities.append(sorted_activities[i])last_selected = ireturn selected_activities
递归:
def recursive_activity_selector(s, f, k, n):# 查找第一个结束时间在k之后开始的活动m = k + 1while m <= n and s[m] < f[k]:m += 1if m <= n:# 如果找到这样的活动,选择它,并递归地寻找下一个活动return [m] + recursive_activity_selector(s, f, m, n)else:# 如果没有更多活动可以选择,返回空列表return []

 877. 石子游戏 感觉被狠狠地耍了!!

class Solution:def stoneGame(self, piles: List[int]) -> bool:n = len(piles)dp = [[0] * n for _ in range(n)]for i in range(n):dp[i][i] = piles[i]for length in range(2, n + 1):for start in range(n - length + 1):end = start + length - 1dp[start][end] = max(piles[start] - dp[start + 1][end], piles[end] - dp[start][end - 1])return dp[0][n - 1] > 0

真不看题解很难理解dp数组的定义,已经能够想到pi...pj分选左还是选右了,但是dp定义差值是真想不到。

定义最优子结构

  • 问题的分解:石子游戏可以被分解成一系列更小的子问题,每个子问题都涉及到从一系列石子堆中选择石子的决策。对于任何一对给定的起始和结束点ij,问题变成了在这个子序列中选择石子以最大化当前玩家相对于对手的分数差。
  • 子问题的最优解:每个子问题的最优解是指在给定的子序列中,玩家可以获得的最大分数差。这个最优解依赖于玩家在子序列的两端选择石子的决策。

最优子结构的体现

  • 当一个玩家面对一个石子堆序列[i...j]时,他们的目标是最大化自己相对于对手的分数差。这个目标可以通过选择序列两端的石子来实现,每次选择后,问题就缩小到一个更小的子序列,要么是[i+1...j],要么是[i...j-1]
  • 对于每个这样的子序列,玩家都面临着同样的问题:如何选择石子以最大化自己的分数差。因此,大问题的最优解依赖于这些子问题的最优解。

状态转移方程

  • 最优子结构允许我们通过状态转移方程来表达问题的解:dp[i][j] = max(piles[i] - dp[i+1][j], piles[j] - dp[i][j-1])。这个方程说明了当前玩家在子序列[i...j]中的最优选择依赖于在缩小的子序列[i+1...j][i...j-1]中的最优选择。

但是实际上对于偶数堆石子的情况,Alice 可以通过选择奇数位置的石子堆或偶数位置的石子堆(从1开始计数)来强迫bob只能选另一种位置的石子堆,确保自己能够获得更多的石子。因为石子总数是奇数,所以奇数位置的石子总数和偶数位置的石子总数不可能相等,Alice 可以选择较多的那一组。

class Solution:def stoneGame(self, piles: List[int]) -> bool:return True

所以这个问题先手必胜...

也算练习一下dp吧...想休息了...

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

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

相关文章

COW AI接入到微信 保姆教程 (部署在服务器,插件安装)

此文章不涉及国外的AI模型&#xff0c;也无需翻墙&#xff0c;跟某AI模型无关&#xff0c;审核大哥别弄错了 最近的AI开始越开越火了&#xff0c;开始介入到我们生活中的方方面面。就有人好奇AI是否能接入到微信吗&#xff1f;我在GitHub上搜索的时候还真有除了对话外还可以通…

MySQL 基础知识(五)之数据增删改

目录 1 插入数据 2 删除数据 3 更改数据 创建 goods 表 drop table if exists goods; create table goods ( id int(10) primary key auto_increment, name varchar(14) unique, stockdate date )charsetutf8; 1 插入数据 当要插入的数据为日期/时间类型时&#xff0c;如果…

Spring Boot 笔记 021 项目部署

1.1 引入坐标&#xff0c;并双击package打包成jar包 1.2 在服务器上运行jar包 1.3 使用postman测试 2.1 运行配置 2.1.1 命令更改端口 java -jar big-event-1.0-SNAPSHOT.jar --server.port7777 2.1.2 环境变量更新&#xff08;略&#xff09; 2.1.3 外部配置文件&#xff0c…

日期类运算符重载以及const成员详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.运算符重载 2.1概念 2.2比较的符号重载 2.2.1…

。ldewd

学习目标&#xff1a; 提示&#xff1a;这里可以添加学习目标 例如&#xff1a; 一周掌握 Java 入门知识 学习内容&#xff1a; 提示&#xff1a;这里可以添加要学的内容 例如&#xff1a; 搭建 Java 开发环境掌握 Java 基本语法掌握条件语句掌握循环语句 学习时间&#x…

ZBX_NOTSUPPORTED: Unsupported item key. 原因排查

进行自定义监控项时&#xff0c;在zabbix-agent端测试没问题&#xff0c;却在zabbix-server进行测试时&#xff0c;出现 ZBX_NOTSUPPORTED: Unsupported item key. 1.在zabbix-agent测试没问题&#xff0c;证明自定义监控项的脚本没问题&#xff0c;却在zabbix-server端测试出…

点击侧边栏菜单时只切换 <router-view> 中的内容,而不是进行整个页面的路由跳转(动态路由)

解决方法&#xff1a;在 <el-menu> 的 select 事件中调用了 handleMenuSelect 方法来处理菜单项的选择。你可以在 handleMenuSelect 方法中根据菜单项的 index 来执行相应的操作&#xff0c;例如更新组件内的数据或者切换组件。由于整个页面的路由路径并没有改变&#xf…

平时积累的FPGA知识点(7)

平时在FPGA群聊等积累的FPGA知识点&#xff0c;第七期&#xff1a; 11 描述扇出的xilinx官方文档是&#xff1f; 解释&#xff1a;ug949 12 在BD中如何指定某个IP用global&#xff0c;其他的用OOC模式&#xff1f;因为某个模块引用的IP带着XPM&#xff0c;综合不了 解释&am…

代码随想录Day50 | 70. 爬楼梯 322. 零钱兑换 279.完全平方数

代码随想录Day50 | 70. 爬楼梯 322. 零钱兑换 279.完全平方数 70.爬楼梯322.零钱兑换279.完全平方数 70.爬楼梯 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 状态 dp数组 dp[j]表示爬上第j阶台阶需要的方法数递推公式&#xff0c;由于在每一阶台阶可以向上走1~m阶&a…

RocketMQ与Kafka深度对比:特性与适用场景解析

在分布式系统中&#xff0c;消息队列作为解耦、缓冲和异步通信的关键组件&#xff0c;其选择对于系统的性能和稳定性至关重要。RocketMQ和Kafka作为两款流行的开源消息中间件&#xff0c;各自拥有独特的设计理念和功能特性。本文将详细对比RocketMQ与Kafka在数据可靠性、实时性…

代码随想录算法训练营Day57|647. 回文子串、516.最长回文子序列、动态规划总结

目录 647. 回文子串 前言 思路 算法实现 516.最长回文子序列 前言 思路 算法实现 动态规划总结 动规五部曲回顾 动规各小专题问题 647. 回文子串 题目链接 文章链接 前言 本题利用动态规划求解时&#xff0c;dp数组的定义与前面的就有些不同了&#xff0c;是难点之…

随机过程及应用学习笔记(三)几种重要的随机过程

介绍独立过程和独立增量过程。重点介绍两种独立增量过程-—维纳过程和泊松过程。 目录 前言 一、独立过程和独立增量过程 1、独立过程&#xff08;Independent Process&#xff09; 2、独立增量过程&#xff08;Independent Increment Process&#xff09; 二、正态过程&am…

Python bytes 类型的可变版本——bytearray类型

bytearray 是 Python 中的一个内置类型&#xff0c;用于表示可变长度的字节序列。它是 bytes 类型的可变版本&#xff0c;即 bytearray 实例的内容可以修改&#xff0c;而 bytes 实例是不可变的。 创建 bytearray 的方式&#xff1a; 通过构造函数创建&#xff1a;可以通过传递…

幻兽帕鲁云服务器机型推荐配置,支持6个人以内/10个人/20个人以内的配置怎么选择?

如果是6个人以下&#xff0c;比较建议4核16G的这个服务器配置。如果人数更多&#xff0c;就选8核32G这个配置&#xff0c;或者更高&#xff0c;如果是20个人以上&#xff0c;那么就得16核64G35M这样或者更高的配置了。 参考&#xff1a; 4~8人&#xff1a;推荐4核16G&#xf…

debug - 打补丁 - 浮点数加法

文章目录 debug - 打补丁 - 浮点数加法概述笔记demo用CE查看汇编(x64debug)main()update_info()快捷键 - CE中查看代码时的导航打补丁的时机 - 浮点数加法补丁代码补丁效果浮点数寄存器组的保存END debug - 打补丁 - 浮点数加法 概述 在cm中, UI上显示的数值仅仅用来显示, 改…

力扣---通配符匹配

题目描述&#xff1a; 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。 * 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 判定匹配成功的充要条件是&#xff…

华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接

文章目录 前言思路主要思路关于f函数的剖析Code就到这&#xff0c;铁子们下期见&#xff01;&#xff01;&#xff01;&#xff01; 前言 铁子们好啊&#xff01;今天阿辉又给大家来更新新一道好题&#xff0c;下面链接是23年9月27的华为笔试原题&#xff0c;LeetCode上面的ha…

《软件质量保证与测试》单元测试:使用单元测试工具 JUnit 测试自定义的类

文章目录 前言一、实验目的二、实验内容三、实验步骤和结果3.1、建立需要进行 JUnit 测试的类 StringUtil3.2、建立对应的 JUnit Test 类 StringUtilTest3.3、添加 JUnit 测试信息3.4、生成测试代码3.5、assertEquals 方法介绍3.6、使用 assertEquals 方法进行单元测试3.7、执行…

开源≠不赚钱,开源软件盈利的7大模式。

开源不是目的&#xff0c;目的是圈用户&#xff0c;留住用户&#xff0c;盈利自然不成问题。 开源系统可以通过多种方式赚钱&#xff0c;以下是其中几种常见的方式&#xff1a; 提供付费支持&#xff1a; 开源系统可以提供付费的技术支持服务&#xff0c;包括安装、配置、维…

mysql5.6安装---windows版本

安装包下载 链接&#xff1a;https://pan.baidu.com/s/1L4ONMw-40HhAeWrE6kluXQ 提取码&#xff1a;977q 安装视频 1.解压完成之后将其放到你喜欢的地址当中去&#xff0c;这里我默认放在了D盘&#xff0c;这是我的根目录 2.配置环境变量 我的电脑->属性->高级->环境…