【leetcode】动态规划刷题总结-区间问题

区间DP问题一般从数组的左右两端不断缩短,求解关于某段下标区间的最优值,dp[i][j]一般定义为下标区间[i,j]的最优值

1.最长回文子序列问题

LeetCode516题 最长回文子序列

class Solution:def longestPalindromeSubseq(self, s: str) -> int:# dp[i][j]表示s[i: j + 1]的最长回文子序列长度dp = [[0] * len(s) for _ in range(len(s))]for i in range(len(s) - 1, -1, -1):for j in range(i, len(s)):if s[i] == s[j]:if j - i == 0:dp[i][j] = 1elif j - i == 1:dp[i][j] = 2else:dp[i][j] = dp[i + 1][j - 1] + 2else:# 此时肯定j>idp[i][j] = max(dp[i + 1][j], dp[i][j - 1])return dp[0][len(s) - 1]

LeetCode1771题 由子序列构造的最长回文串的长度

令s=word1+word2,在求s的最长回文子串的过程中,记录符合要求的答案

class Solution:def longestPalindrome(self, word1: str, word2: str) -> int:res = 0s = word1 + word2n = len(s)dp = [[0] * n for _ in range(n)]for i in range(n - 1, -1, -1):dp[i][i] = 1for j in range(i + 1, n):if s[i] == s[j]:dp[i][j] = dp[i + 1][j - 1] + 2if i < len(word1) <= j:res = max(res, dp[i][j])  # f[i][j] 一定包含 s[i] 和 s[j]else:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])return res

LeetCode647题 回文子串

动态规划解法

class Solution:def countSubstrings(self, s: str) -> int:res = 0# dp[i][j]表示s[i: j+1]是否为回文串dp = [[False] * len(s) for _ in range(len(s))]for i in range(len(s) - 1, -1, -1):for j in range(i, len(s)):if s[i] == s[j]:if i + 1 > j - 1:dp[i][j] = Trueelse:dp[i][j] = dp[i+1][j-1]if dp[i][j]:res += 1return res

双指针解法-空间复杂度低

class Solution:def countSubstrings(self, s: str) -> int:# 中心扩散函数def get_Center(s, l, r):count = 0while l >= 0 and r < len(s) and s[l] == s[r]:l -= 1r += 1count += 1return countres = 0for i in range(len(s)):res += get_Center(s, i, i) + get_Center(s, i, i+1)return res

LeetCode730题 统计不同回文子序列

647题的非连续子序列版本,且不能有重复

class Solution:def countPalindromicSubsequences(self, s: str) -> int:# dp[k][i][j]表示s[i:j+1]中以k(k是{'a','b','c','d'}中之一)为开头结尾的回文子序列个数mod = 10**9 + 7n = len(s)dp = [[[0] * n for _ in range(n)] for _ in range(4)]for i in range(n - 1, -1, -1):for j in range(i, n):for k, c in enumerate('abcd'):if s[i] == c and s[j] == c:if j - i == 0:dp[k][i][j] = 1elif j - i == 1:dp[k][i][j] = 2else:dp[k][i][j] = (2 + sum(d[i + 1][j - 1] for d in dp)) % modelif s[i] == c:dp[k][i][j] = dp[k][i][j - 1]elif s[j] == c:dp[k][i][j] = dp[k][i + 1][j]else:if j - i > 1:dp[k][i][j] = dp[k][i + 1][j - 1]return sum(d[0][n - 1] for d in dp) % mod

2.其他区间DP

LeetCode96题 不同的二叉搜索树

class Solution:def numTrees(self, n: int) -> int:# dp[i]表示i个不同的数组成的二叉搜索树的种类数# dp[i] = \sum dp[k - 1] * dp[i - k]  (1 <= k <= i)dp = [0] * (n + 1)dp[0] = 1for i in range(1, n + 1):for k in range(1, i + 1):dp[i] += dp[k - 1] * dp[i - k]return dp[n]

LeetCode375题 猜数字大小II

class Solution:def getMoneyAmount(self, n: int) -> int:# dp[i][j]表示当选的数字在区间[i, j]中时,确保获胜的最小现金数# dp[i][j] = min {max(dp[i][x - 1], dp[x + 1][j]) + x} 对x取mindp = [[float('inf')] * (n + 1) for _ in range(n + 1)]for i in range(n, 0, -1):for j in range(i, n + 1):# 当区间长度为1时,此时不需要支付if i == j:dp[i][j] = 0continuefor x in range(i, j + 1):if x == 1:dp[i][j] = min(dp[x + 1][j] + x, dp[i][j])elif x == n:dp[i][j] = min(dp[i][x - 1] + x, dp[i][j])else:dp[i][j] = min(max(dp[i][x - 1], dp[x + 1][j]) + x, dp[i][j])return dp[1][n]

LeetCode1130题 叶值的最小代价生成树

class Solution:def mctFromLeafValues(self, arr: List[int]) -> int:# dp[i][j]代表arr[i: j + 1]的非叶节点最小和# dp[i][j] = min{ dp[i][k] + dp[k + 1][j] + max(arr[i: k + 1]) * max(arr[k + 1: j + 1] }  i <= k <= j - 1# 求最值优化:# max_val[i][j]代表arr[i: j + 1]的最大值# max_val[i][j] = max(arr[i], max_val[i + 1][j])# dp[i][j] = min{ dp[i][k] + dp[k + 1][j] + max_val[i][k] * max_val[k + 1][j] }  i <= k <= j - 1n = len(arr)dp = [[float('inf')] * n for _ in range(n)]max_val = [[0] * n for _ in range(n)]for i in range(n - 1, -1, -1):max_val[i][i] = arr[i]dp[i][i] = 0for j in range(i + 1, n):max_val[i][j] = max(arr[i], max_val[i + 1][j])for k in range(i, j):dp[i][j] = min(dp[i][k] + dp[k + 1][j] + max_val[i][k] * max_val[k + 1][j], dp[i][j])return dp[0][n - 1]

LeetCode664题 奇怪的打印机

dp[i][j]代表的是字符串在区间[i:j+1]中需要最少的打印次数

  • 打印一个字符串的次数为1,因此dp[i][i] = 1
  • 当字符串长度大于等于2时,判断是否两边区间字符相等s[i] == s[j]
    • 如果相等,打印次数可以从子区间的打印次数转移而来dp[i][j] = dp[i][j-1];。例如aba的打印次数由ab的打印次数决定
    • 如果不相等,则枚举所有的可能组合,然后取其最优解
class Solution:def strangePrinter(self, s: str) -> int:# dp[i][j]表示打印s[i: j + 1]需要的最少打印次数# dp[i][j] = dp[i][j - 1] / min(dp[i][j], dp[i][k] + dp[k + 1][j]) i <= k <= jn = len(s)dp = [[n] * n for _ in range(n)]for i in range(n - 1, -1, -1):dp[i][i] = 1for j in range(i + 1, n):if s[i] == s[j]:dp[i][j] = dp[i][j - 1]else:for k in range(i, j + 1):if k == n - 1:dp[i][j] = min(dp[i][j], dp[i][k])else:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j])return dp[0][n - 1]

LeetCode312题 戳气球

class Solution:def maxCoins(self, nums: List[int]) -> int:# dp[i][j]表示戳破区间(i, j)内的所有气球能得到的最多硬币数,那么答案即为dp[0][n+1]# dp[i][j] = 对k取max(dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j]),k表示是最后一个戳破的气球n = len(nums)nums = [1] + nums + [1]dp = [[0] * (n + 2) for _ in range(n + 2)]for i in range(n - 1, -1, -1):for j in range(i + 2, n + 2):for k in range(i + 1, j):dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j])return dp[0][n + 1]

LeetCode87题 扰乱字符串

class Solution:def isScramble(self, s1: str, s2: str) -> bool:# dp[i][j][l]表示s2[j: j + l]是否是s1[i: i + l]的扰乱字符串 1 <= l <= n - max(i, j)# dp[i][j][l] = (dp[i][j][k] and dp[i + k][j + k][l - k]) | (dp[i][j + l - k][k] and dp[i + k][j][l - k])#               1 <= k <= l - 1      n = len(s1)dp = [[[False] * (n + 1) for _ in range(n)] for _ in range(n)]for i in range(n):for j in range(n):dp[i][j][1] = (s1[i] == s2[j])for i in range(n - 1, -1, -1):for j in range(n - 1, -1, -1):for l in range(2, n - max(i, j) + 1):for k in range(1, l):# 分别对应不交换、交换情形dp[i][j][l] = dp[i][j][l] | \(dp[i][j][k] and dp[i + k][j + k][l - k]) | \(dp[i][j + l - k][k] and dp[i + k][j][l - k])return dp[0][0][n]

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

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

相关文章

【Java面试——计算机基础——网络——一篇就够了!!!】

1. 网络分层模型 1.1 OSI七层模型 OSI 七层模型 是国际标准化组织提出的一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 每一层都专注做一件事情&#xff0c;并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和…

C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

(C#面向初学者的 .NET 的生成 AI) 第 3 部分-ChatGPT 简介

在本部分中&#xff0c;将简要介绍ChatGPT。我们将了解ChatGPT是什么&#xff0c;稍微探讨一下ChatGPT中的角色分工&#xff0c;聊天和消息历史记录的作用。最后我们将查看一个使用OpenAI .NET SDK的ChatGPT代码示例。 1、ChatGPT是什么呢&#xff1f; ChatGPT中的GPT部分来…

Java中的日期与时间的间隔:Period类、Duration类

1、Period 类 在 Java 中&#xff0c;Period 类和 Duration 类都是用于表示时间间隔的类&#xff0c;但它们有不同的使用场景和特性。Period 类位于 java.time 包中&#xff0c;主要用于表示基于日期的时间间隔&#xff0c;即年、月、日的差异。它常用于处理日期之间的计算&am…

算法: 链表题目练习

文章目录 链表题目练习两数相加两两交换链表中的节点重排链表合并 K 个升序链表K 个一组翻转链表 总结 链表题目练习 两数相加 坑: 两个链表都遍历完后,可能需要进位. class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode cur1 l1;ListNode…

交替传译收费标准

交替传译是一种高端口服务&#xff0c;常用于国际会议、商务洽谈、学术交流等多语言会议场合&#xff0c;演讲者的发言一般不超过15分钟&#xff0c;交替传译员和演讲者采取接力式交替发言&#xff0c;在这种模式下&#xff0c;口译员需要具备优秀的记忆能力和翻译功底。其价格…

灵动AI视频:重塑视频创作,智启无限灵感!

&#x1f680; 在这个视觉为王的时代&#xff0c;视频创作已成为展现创意与才华的重要舞台。然而&#xff0c;繁琐的剪辑流程、有限的创意资源往往成为制约创作者发挥的瓶颈。灵动AI视频&#xff0c;一款集智能、高效、创意于一体的视频编辑神器&#xff0c;正为视频创作领域带…

生物信息学R语言

检查R语言安装包和依赖 .libPaths() 这里有一个简单的生物信息学分析案例&#xff0c;使用R语言处理基因表达数据。这个示例中&#xff0c;我们将导入模拟的基因表达数据&#xff0c;进行数据预处理&#xff08;如归一化&#xff09;&#xff0c;并使用主成分分析&#xff08…

基于VsCode platformio的stm32开发环境搭建

背景 VsCode作为当下流行的编辑器&#xff0c;且不单单是一个编辑器里面集成了很多插件&#xff0c;使用这些插件可以完成很多功能。 STM32开发环境除了KEIL与IAR&#xff0c;其实还有很多其他的开方方式&#xff0c;ST官方提供了很多的开发软件&#xff0c;基于Eclipse也可以…

【题解】【排序】—— [NOIP2017 普及组] 图书管理员

【题解】【排序】—— [NOIP2017 普及组] 图书管理员 [NOIP2017 普及组] 图书管理员题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 1.思路解析2.AC代码 [NOIP2017 普及组] 图书管理员 通往洛谷的传送门 题目背景 NOIP2017 普及组 T2 题目描述 图书馆中…

华为和思科的配置

vrrp和mstp 思路 vrrp是用来虚拟网关&#xff0c;噢&#xff0c;是虚拟一条虚拟网关 优先级&#xff0c;priority越大越优先&#xff0c;优先级相同&#xff0c;哪个的路由器的vrrp先起来&#xff0c;谁就是主 mstp是快速生成树协议&#xff0c;防止环路用的 优先级越小越优…

React 前端如何通过组件完成 “下载 Excel模板” 和 “上传 Excel 文件并读取内容生成可使用的对象数组”

文章目录 一、Excel 模板下载01、代码示例 二、Excel 文件上传01、文件展示02、示例代码03、前端样式展示04、数据结果展示 三、完整代码 本文的业务需求是建立在批量导入数据的情况下&#xff0c;普通组件只能少量导入&#xff0c;数据较多的情况都会选择 Excel 数据导入&…

『统计检验』一篇文章入门置信区间

文章目录 置信区间点估计和区间估计置信度置信区间的计算置信区间计算的具体例子 参考文献 置信区间 置信区间是总体参数落在测量结果周围的程度 点估计和区间估计 点估计&#xff1a;通过样本数据估计总体参数 ⇒ \Rightarrow ⇒使用样本统计量&#xff08;如样本均值、样本…

ESRALLY安装与使用

ESRALLY安装与使用 geonames、geopoint:都是和地理位置相关的,如果需要测试ES在地理位置处理的性能可以选用 http_logs:是http_server的,如果要测服务器日志、redis日志、apache日志可以选用 说明:esrally 自带的测试数据即为 rally_track 文件夹中的内容,主要包括: Ge…

SpringMvc day1101

ok了家人们&#xff0c;今天我们继续 studying springMvc&#xff0c;let‘me see see 四.SSM整合 SpringMVC Spring MyBatis WebConfig SpringConfigMybatisConfig SpringMvcSupport jdbc.properties 表现层 业务层持久层 EmpController EmpServiceEmpMapper EmpServiceIm…

关于基于 GA102 核心的显卡及主要参数

基于 GA102 核心的显卡的主要参数&#xff1a; 主要用途 高端游戏, 专业图形处理 高端游戏, 专业图形处理 高端游戏, 专业图形处理 高端游戏, 专业图形处理 专业图形处理, 数据中心 数据中心, AI 计算 解释 CUDA 核心数&#xff1a;更多的 CUDA 核心意味着更强的并行计算能力。…

C++ 多态 (详解)

多态的概念 通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学生买票时&#xff0c;是半价…

雷池社区版新版本功能防绕过人机验证解析

前两天&#xff0c;2024.10.31&#xff0c;雷池社区版更新7.1版本&#xff0c;其中有一个功能&#xff0c;新增请求防重放 更新记录&#xff1a;hhttps://docs.waf-ce.chaitin.cn/zh/%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0%E8%AE%B0%E5%BD%95 仔细研究了这个需求&#xff0c;…

省级-社会保障水平数据(2007-2022年)

社会保障水平是一个综合性的概念&#xff0c;它不仅涉及到一个国家或地区的社会保障制度覆盖范围&#xff0c;还包括了提供的保障种类与水平&#xff0c;以及这些制度在满足公民基本生活需求方面的能力。 2007-2022年省级-社会保障水平数据.zip资源-CSDN文库https://download.…

如何搭建汽车行业AI知识库:定义+好处+方法步骤

在汽车行业&#xff0c;大型车企面临着员工众多、价值链长、技术密集和知识传播难等挑战。如何通过有效的知识沉淀与应用&#xff0c;提升各部门协同效率&#xff0c;快速响应客户咨询&#xff0c;降低销售成本&#xff0c;并开启体系化、可持续性的知识管理建设&#xff0c;成…