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

判定能否划分

一般定义dp[i]表示nums[:i + 1]能否划分,然后枚举最后一个子数组的左端点,得到nums[:i + 1]能否划分

LeetCode2369题 检查数组是否存在有效划分

class Solution:def validPartition(self, nums: List[int]) -> bool:if len(nums) == 2:return nums[0] == nums[1]# dp[i]表示nums[:i + 1]是否存在有效划分# dp[i] = (nums[i - 1] == nums[i] and dp[i - 2]) or \#         (nums[i - 1] == nums[i] and nums[i - 2] == nums[i] and dp[i - 3]) or \#         (nums[i - 1] + 1 == nums[i] and nums[i - 2] + 2 == nums[i] and dp[i - 3])dp = [False] * 3if nums[0] == nums[1]:dp[1] = Trueif (nums[0] == nums[1] and nums[0] == nums[2]) or (nums[1] + 1 == nums[2] and nums[0] + 2 == nums[2]):dp[2] = Truefor i in range(3, len(nums)):r = (nums[i - 1] == nums[i] and dp[- 2]) or \(nums[i - 1] == nums[i] and nums[i - 2] == nums[i] and dp[- 3]) or \(nums[i - 1] + 1 == nums[i] and nums[i - 2] + 2 == nums[i] and dp[- 3])dp[0], dp[1], dp[2] = dp[1], dp[2], rreturn dp[-1]

最优划分

一般定义dp[i]表示nums[:i + 1]分割出满足条件的最少(最多)划分方案数,然后枚举最后一个子数组的左端点,计算nums[:i + 1]最优划分

LeetCode132题 分割回文串II

先使用区间DP解法记录s[i:j + 1]是否是回文子串,然后再用划分DP解法

class Solution:def minCut(self, s: str) -> int:# dp[i]表示s[:i + 1]分割为一些回文串的最少分割次数# dp[i] = min(dp[i], dp[j - 1] + 1) 0 <= j <= i# dp_huiwen[i][j]表示s[i: j + 1]是否是回文子串# dp_huiwen[i][j] = s[i] == s[j] and dp_huiwen[i + 1][j - 1]n = len(s)dp_huiwen = [[False] * n for _ in range(n)]for i in range(n - 1, -1, -1):dp_huiwen[i][i] = Truefor j in range(i + 1, n):if s[i] == s[j]:if j - i == 1:dp_huiwen[i][j] = Trueelse:dp_huiwen[i][j] = dp_huiwen[i + 1][j - 1]dp = [n] * ndp[0] = 0for i in range(1, n):for j in range(i + 1):if dp_huiwen[j][i]:if j == 0:dp[i] = 0else:dp[i] = min(dp[i], dp[j - 1] + 1)return dp[-1]

约束划分个数

将数组划分为(恰好/至多)k个子数组,计算与这些子数组有关的最优值。一般定义dp[i][j]表示将nums[:j + 1]划分为i个子数组所得到的最优解

LeetCode1043题 分隔数组以得到最大值

class Solution:def maxSumAfterPartitioning(self, arr: List[int], k: int) -> int:# dp[i]表示分隔arr[:i + 1]得到的最大和# dp[i] = max{dp[j - 1] + max(arr[j: i + 1]) * (i - j + 1) | i - k + 1 <= j <= i}n = len(arr)dp = [0] * nfor i in range(n):max_val = arr[i]# j代表与arr[i]一组的左侧索引# 倒序遍历为了方便求最大值for j in range(i, max(i - k, -1), -1):max_val = max(max_val, arr[j])if j == 0:dp[i] = max(dp[i], max_val * (i - j + 1))else:dp[i] = max(dp[i], dp[j - 1] + max_val * (i - j + 1))return dp[-1]

LeetCode1745题 分割回文串IV

class Solution:def checkPartitioning(self, s: str) -> bool:# dp[i][j]表示s[i:j + 1]是否是回文串# dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1]n = len(s)dp = [[False] * n for _ in range(n)]for i in range(n - 1, -1, -1):dp[i][i] = Truefor j in range(i + 1, n):if j - i == 1:dp[i][j] = s[i] == s[j]else:dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1]# i代表第2个回文子串开头索引,j代表第3个回文子串开头索引for i in range(1, n - 1):for j in range(i + 1, n):if dp[0][i - 1] and dp[i][j - 1] and dp[j][n - 1]:return Truereturn False

 LeetCode813题 最大平均值和的分组

class Solution:def largestSumOfAverages(self, nums: List[int], k: int) -> float:# dp[i][j]表示nums[:i + 1]分成最多j个非空子数组的最大平均值和# dp[i][j] = max{ dp[s - 1][j - 1] + sum(nums[s:i + 1]) / (i - s + 1) | 0 <= s <= i}# 其中s表示和nums[i]一组的左侧元素索引n = len(nums)prefix_nums = [nums[0]]for i in range(1, n):prefix_nums.append(prefix_nums[-1] + nums[i])dp = [[0] * (k) for _ in range(n)]for i in range(n):dp[i][0] = prefix_nums[i] / (i + 1)for j in range(1, k):for s in range(0, i + 1):if s == 0:dp[i][j] = max(dp[i][j], prefix_nums[i] / (i - s + 1))else:dp[i][j] = max(dp[i][j], dp[s - 1][j - 1] + (prefix_nums[i] - prefix_nums[s - 1]) / (i - s + 1))return dp[-1][-1]

LeetCode1235题 规划兼职工作

先按照结束时间排序,然后分类讨论,求出按照结束时间排序后的前i个工作的最大报酬:

  • 不选第 i 个工作,那么最大报酬等于前i−1个工作的最大报酬(转换成了一个规模更小的子问题)
  • 选第 i 个工作,由于工作时间不能重叠,设k是最大的满足endTime[k]≤startTime[i]的k,那么最大报酬等于前k个工作的最大报酬加上profit[i](同样转换成了一个规模更小的子问题)

这两种决策取最大值。其中第二个情况可以用二分查找得到动态规划递推公式的信息,复杂度O(n*logn)

class Solution:def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[int]) -> int:sorted_combined = sorted(zip(startTime, endTime, profit), key=lambda x: (x[1], x[0]))# dp[i]表示0-i的工作的最大报酬# dp[i] = max(dp[i - 1], dp[k] + profit[i])dp = [0] * len(sorted_combined)dp[0] = sorted_combined[0][2]for i in range(1, len(sorted_combined)):k = self.search(sorted_combined, i - 1, sorted_combined[i][0])dp[i] = max(dp[i - 1], dp[k] + sorted_combined[i][2])return dp[-1]def search(self, sorted_combined, end, start_time):# endTime中寻找小于等于start_time的右边界left = 0right = endwhile left <= right:mid = left + (right - left) // 2if sorted_combined[mid][1] > start_time:right = mid - 1else:left = mid + 1return right

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

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

相关文章

[含文档+PPT+源码等]精品基于springboot实现的原生Andriod广告播放系统

基于Spring Boot实现的原生Android广告播放系统背景&#xff0c;主要可以从以下几个方面进行阐述&#xff1a; 一、市场需求与背景 移动互联网的快速发展&#xff1a; 随着移动互联网技术的不断进步&#xff0c;智能手机已成为人们日常生活中不可或缺的一部分。人们越来越多地…

【汇编语言】[BX]和loop指令(四)—— 汇编语言中的段前缀与内存保护:原理与应用解析

文章目录 前言1. 段前缀1.1 示例演示1.2 总结 2. 一段安全的空间2.1 存在的问题2.2 示例演示2.2.1 编译、链接、加载程序2.2.2 运行程序 2.3 总结 3. 段前缀的使用3.1 问题引入3.2 分析问题3.3 代码实现3.4 程序的改进3.4.1 分析3.4.2 代码实现 结语 前言 &#x1f4cc; 汇编语…

经典双指针--合并升序链表

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h>typedef struct Node {int data;struct Node* next; } Node;Node* newNode(int data);/* 请完成下面的函数 */ Node* mergeList(Node* L1, Node* L2) {Node* head n…

Python代码主要实现了一个基于Transformer和LSTM的混合模型,用于对给定数据集进行二分类任务

Python代码主要实现了一个基于Transformer和LSTM的混合模型,用于对给定数据集进行二分类任务。代码的大致流程包括数据读取、数据预处理、模型构建、模型训练与评估以及结果输出。 #!/usr/bin/env python # coding: utf-8# In[4]:import numpy as np import pandas as pd imp…

dell服务器安装ESXI8

1.下载镜像在官网 2.打开ipmi&#xff08;idrac&#xff09;&#xff0c;将esxi镜像挂载&#xff0c;然后服务器开机 3.进入bios设置cpu虚拟化开启&#xff0c;进入boot设置启动选项为映像方式 4..进入安装引导界面3.加载完配置进入安装 系统提示点击继 5.选择安装磁盘进行…

【dvwa靶场:XSS系列】XSS (Stored)低-中-高级别,通关啦

更改name的文本数量限制大小&#xff0c; 其他我们只在name中进行操作 【除了低级可以在message中进行操作】 一、低级low <script>alert("假客套")</script> 二、中级middle 过滤了小写&#xff0c;咱们可以大写 <Script>alert("假客套…

基于Python的自然语言处理系列(57):使用最佳表示向量法实现整本书的高效摘要

在自然语言处理中,处理大型文档,如书籍或长篇文本,总结其关键内容是一项挑战。面对长达数万或数十万字的书籍时,我们往往需要找到一种既能代表书籍主旨,又能降低处理成本的方法。本篇博文介绍了一种称为“最佳表示向量法”(Best Representation Vectors)的技术,通过向量…

从0开始学习机器学习--Day19--学习曲线

一般来说&#xff0c;如果一个算法的表现不理想&#xff0c;那么多半是因为出现了欠拟合或过拟合问题&#xff0c;这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题&#xff0c;亦或是二者皆有&#xff0c;这有助于我们精准定位问题所在。 之前&#xff0c;我们发现…

大牛直播SDK如何实现Android平台多路RTSP播放?

技术背景 好多开发者&#xff0c;希望能在Android平台实现多路RTSP播放&#xff0c;从而达到集中监控的目的&#xff0c;以下是使用大牛直播 SDK 在 Android 平台上实现 RTSP 多路播放的一般步骤&#xff1a; 初始化 SDK 在项目的build.gradle文件中添加大牛直播 SDK 的依赖。…

在研究中经常使用的数据可视化工具并进行分析

引言 在现代研究中&#xff0c;数据的复杂性不断增加&#xff0c;然而&#xff0c;通过数据可视化工具&#xff0c;研究人员能够将纷繁的数据转化为直观的图形&#xff0c;提供清晰的洞察&#xff0c;以便更好地解读数据和作出决策。选择合适的数据可视化工具不仅能提高工作效…

linux 通过apt安装软件包时出现依赖包版本不对的问题解决

通过网上查找解决办法时&#xff0c;发现的解决办法无法完美解决问题: 比如通过安装对应版本解决 如: sudo apt-get install xxx2.7.0ubuntu 这样会先卸载原先包&#xff0c;在安装对应版本的包 或者直接删除依赖的包 sudo apt-get purge xxxx 如果碰到底层包的话&#xf…

浮点数和字节数据的在线转换工具

具体请参考&#xff1a;浮点数在线转四字节字节序工具--在线将float浮点数转化为类似内存中的4字节字节序&#xff0c;支持2进制&#xff0c;10进制&#xff0c;16进制

GitLab基于Drone搭建持续集成(CI/CD)

本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。 1. 准备工作 创建OAuth应用 创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。 ps:授权回调 URL 必须与以下格式和路径匹配&…

2024网鼎杯web1+re2 wp

这两道题属于比较简单的&#xff0c;顺道说一下&#xff0c;今年的题有点抽象&#xff0c;web不是misc&#xff0c;re不是web的&#xff0c;也有可能时代在进步&#xff0c;现在要求全栈✌了吧 web1 最开始被强网的小浣熊带偏思路了&#xff0c;进来疯狂找sql注入&#xff0c…

「C/C++」C/C++关键字 之 const常量

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

CSS中的变量应用——:root,Sass变量,JavaScript中使用Sass变量

:root—— 原生CSS 自定义属性&#xff08;变量&#xff09; 在 SCSS 文件中定义 CSS 自定义属性。然后通过 JavaScript 读取这些属性。 // variables.scss :root { --login-bg-color: #293146;--left-menu-max-width: 200px;--left-menu-min-width: 64px;--left-menu-bg-…

复现LLM:带你从零认识语言模型

前言 本文会以Qwen2-0.5B模型为例&#xff0c;从使用者的角度&#xff0c;从零开始一步一步的探索语言模型的推理过程。主要内容如下&#xff1a; 从使用的角度来接触模型本地运行的方式来认识模型以文本生成过程来理解模型以内部窥探的方式来解剖模型 1. 模型前台使用 1.1…

【NLP自然语言处理】深入探索Self-Attention:自注意力机制详解

目录 &#x1f354; Self-attention的特点 &#x1f354; Self-attention中的归一化概述 &#x1f354; softmax的梯度变化 3.1 softmax函数的输入分布是如何影响输出的 3.2 softmax函数在反向传播的过程中是如何梯度求导的 3.3 softmax函数出现梯度消失现象的原因 &…

Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff0c;从而报警&#xff0…

Linux多线程(个人笔记)

Linux多线程 1.Linux线程概念1.1线程的优点1.2线程的缺点 2.Linux线程VS进程3.Linux线程控制3.1创建线程3.2线程tid及进程地址空间布局3.3线程终止3.4线程等待 4.分离线程5.线程互斥5.1互斥锁mutex5.2互斥锁接口5.3互斥锁实现原理5.4可重入VS线程安全 6.线程同步6.1条件变量6.2…