代码随想录算法训练营第三十四天丨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/679325.shtml

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

相关文章

Hyper-V 调整 设置 Ubuntu 虚拟机的分辨率

使用win10 的hyper-v安装 ubuntu20&#xff0c; 在ubuntu内无法调整display settings。可以使用以下方法 解决&#xff1a; 1.修改ubuntu系统中的grub文件&#xff1b; 使用命令行&#xff1a; sudo vi /etc/default/grub 找到GRUB_CMDLINE_LINUX_DEFAULT这一行&#xff0c;…

JAVA基本内容(数据类型、标识符、数组、注释、关键字)

目录 基本数据类型 取值范围大小 情景一&#xff1a; 情景二&#xff1a; 情景三&#xff1a; 情景四&#xff1a; 标识符 情景一&#xff1a; 情景二&#xff1a; 情景三&#xff1a; 数组 一维数组 二维数组 多维数组 注释 单行注释 多行注释 文档注释 关键字 基本数据类…

【Android】使用Termux终端搭建本地web服务器

在Android手机上有一个Termux APP&#xff0c;可运行类似 Linux 终端的模拟器&#xff0c;可以运行Nodejs&#xff0c;正好用它运行本地站点&#xff0c;用不着去租服务器&#xff0c;相比运行在电脑上&#xff0c;节省了电费&#xff0c;想要学来用的话不妨看看这篇文章。 文章…

案例:CentOS8 在 MySQL8.0 实现半同步复制

异步复制 MySQL 默认的复制即是异步的&#xff0c;主库在执行完客户端提交的事务后会立即将结果返给给客户端&#xff0c;并不关心从库是否已经接收并处理&#xff0c;这样就会有一个问题&#xff0c;主节点如果 crash 掉了&#xff0c;此时主节点上已经提交的事务可能并没有传…

Python:解析获取连续的重叠对pairwise

简介&#xff1a;pairwise函数&#xff0c;返回从输入迭代器获取的重叠对的迭代器&#xff0c;是Python 3.10 新特性&#xff0c;表示一个迭代器从对象中获取连续的重叠对&#xff0c;在某些场景中可以优化代码运行效率。pairwise 函数是一种用于处理列表中元素之间配对操作的通…

四元数如何进行标准化?

假设有一个四元数的张量 r&#xff0c;它包含了两个四元数&#xff1a; r [ 1 2 3 4 4 3 2 1 ] r \begin{bmatrix} 1 & 2 & 3 & 4 \\ 4 & 3 & 2 & 1 \\ \end{bmatrix} r[14​23​32​41​] 这里&#xff0c;第一个四元数是 q 1 ( 1 , 2 , 3 , 4 ) …

【Langchain Agent研究】SalesGPT项目介绍(二)

【Langchain Agent研究】SalesGPT项目介绍&#xff08;一&#xff09;-CSDN博客 上节课&#xff0c;我们介绍了SalesGPT他的业务流程和技术架构&#xff0c;这节课&#xff0c;我们来关注一下他的项目整体结构、poetry工具和一些工程项目相关的设计。 项目整体结构介绍 我们把…

互联网医院架构系统设计与实现

随着互联网技术的快速发展&#xff0c;互联网医院作为一种新兴的医疗服务模式&#xff0c;正逐渐受到人们的关注和使用。本文将介绍互联网医院架构系统的设计原则和关键组件&#xff0c;以及如何实现一个安全、高效和可扩展的互联网医疗服务平台。 内容&#xff1a; 1. 引言 …

LeetCode Python - 9.回文数

文章目录 题目答案运行结果 题目 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&am…

【开源】基于JAVA+Vue+SpringBoot的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

【JavaScript】文档对象模型(DOM)的基本概念

文章目录 1. 什么是DOM2. DOM的层次结构3. 获取DOM元素通过标签名获取元素通过ID获取元素通过类名获取元素 4. 操作DOM元素修改元素内容修改元素样式添加新元素 5. 事件处理6. 总结 文档对象模型&#xff08;DOM&#xff09;是 JavaScript 中一个重要的概念&#xff0c; 它允许…

【ECMAScript modules规范示例详解——介绍】

ECMAScript modules规范示例详解——介绍 1. 介绍2. 创建一个模块&#xff08;module.js&#xff09;3. 导入模块&#xff08;main.js&#xff09;4. 说明 1. 介绍 ECMAScript 模块 (ESM) 是 JavaScript 的官方标准&#xff0c;用于在 JavaScript 应用程序中导入和导出模块&am…

ChatGPT 4:新特性与优势

ChatGPT 4&#xff1a;新特性与优势 一、引言 ChatGPT 4是一款备受瞩目的人工智能模型&#xff0c;它以其强大的语言生成能力和智能回答能力&#xff0c;为用户提供了更高效、更便捷的对话体验。为了能够充分享受ChatGPT 4的各项功能&#xff0c;本文将向您详细介绍其新特性&…

Ps:信息面板

Ps菜单&#xff1a;窗口/信息 Window/Info 快捷键&#xff1a;F8 信息 Info面板提供了关于工作文档和当前操作的实时信息&#xff0c;包括鼠标指针的位置、取样点的颜色值&#xff08;包括调整前后的对比值&#xff09;&#xff0c;以及当前所用工具的提示信息等等&#xff0c;…

PyTorch深度学习实战(26)——多对象实例分割

PyTorch深度学习实战&#xff08;26&#xff09;——多对象实例分割 0. 前言1. 获取并准备数据2. 使用 Detectron2 训练实例分割模型3. 对新图像进行推断小结系列链接 0. 前言 我们已经学习了多种图像分割算法&#xff0c;在本节中&#xff0c;我们将学习如何使用 Detectron2 …

GPT最新进展:推出视频功能!迭代即将来临!

随着人工智能的不断进步&#xff0c;ChatGPT正准备以其全新的视频功能大跃进&#xff0c;同时&#xff0c;备受期待的GPT-5也即将在今年露面&#xff0c;预示着AI领域即将迎来一场变革。 在最近一期充满激情的Unconfuse Me播客中&#xff0c;OpenAI的首席执行官Sam Altman与技…

【前端高频面试题--Vue基础篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--Vue基础篇 Vue基本原理双向绑定与MVVM模型Vue的优点计算属性与监听属性计算属性监…

C 练习实例69-约瑟夫环

题目&#xff1a;有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 代码&#xff1a; #include <stdio.h> int main() {int n8;int table[n]…

【MySQL】-19 MySQL综合-5(MySQL日期和时间类型+MySQL字符串类型+MySQL二进制类型)

MySQL日期和时间类型MySQL字符串类型MySQL二进制类型 一 MySQL 日期和时间类型1.1 YEAR 类型1.2 TIME 类型1.3 DATE 类型1.4 DATETIME 类型1.5 TIMESTAMP 类型 二 MySQL 字符串类型2.1 CHAR 和 VARCHAR 类型2.2 TEXT 类型2.3 ENUM 类型12.4 SET 类型 三 MySQL 二进制类型BIT 类…

python+flask+django医院预约挂号病历分时段管理系统snsj0

技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm . 第一&#xff0c;研究分析python技术&#xff0c…