当前位置: 首页 > news >正文

【算法篇】动态规划(二)

文章目录

  • 分割回文字符串
  • 编辑距离
  • 不同的子序列
  • 动态规划解题思路

分割回文字符串

在这里插入图片描述
在这里插入图片描述

class Solution {
public:bool isPal(string& s,int begin,int end){while(begin<end){if(s[begin]!=s[end]){return false;}begin++;end--;}return true;}int minCut(string s) {int len=s.size();vector<int> segsize(len+1);if(len==0)//空串{return 0;}if(isPal(s,0,len-1))//整体都为回文{return 0;}//进行初始化,每个字符位置的最大分割次数for(int i=1;i<=len;i++){segsize[i]=i-1;}for(int i=2;i<=len;i++){//判断0~i之间是否都为回文,因为要取的是最小值if(isPal(s,0,i-1)){segsize[i]=0;}//下面从j=1开始是因为上面已经将0~i-1已经判断过了for(int j=1;j<i;j++){//j<i&&isPal(s,j,i-1),min(segsize[i],segsize[j]+1)//取最小值,可能为零也可能是距离上一个回文的值加1if(j<i&&isPal(s,j,i-1)){segsize[i]=min(segsize[i],segsize[j]+1);}}}return segsize[len];}
};
class Solution {
public:vector<vector<bool>> GetMat(string & s){int n=s.size();vector<vector<bool>> Mat(n,vector<bool>(n,false));//这里为什么是从大到小遍历,看下面的图片//s[i]==s[j]&&f(i+1;j-1)是回文因为要找i+1;j-1它们之间的区间,也就需要向下查找for(int i=n-1;i>=0;i--){//这里i是小于等于j的for(int j=i;j<n;j++){if(i==j){Mat[i][j]=true;}else if(i+1==j){Mat[i][j]=s[i]==s[j];}else{Mat[i][j]=(s[i]==s[j])&&(Mat[i+1][j-1]);}}}return Mat;}int minCut(string s) {int len=s.size();vector<int> segsize(len+1);vector<vector<bool>> Mat=GetMat(s);if(len==0)//空串{return 0;}if(isPal(s,0,len-1))//整体都为回文{return 0;}//进行初始化,每个字符位置的最大分割次数for(int i=0;i<=len;i++){segsize[i]=i-1;}for(int i=2;i<=len;i++){//判断0~i之间是否都为回文,因为要取的是最小值//下面从j=1开始是因为上面已经将0~i-1已经判断过了for(int j=0;j<i;j++){//j<i&&isPal(s,j,i-1),min(segsize[i],segsize[j]+1)//取最小值,可能为零也可能是距离上一个回文的值加1if(Mat[j][i-1]){segsize[i]=min(segsize[i],segsize[j]+1);}}}return segsize[len];}
};

在这里插入图片描述

编辑距离

在这里插入图片描述

class Solution {
public:int minDistance(string word1, string word2) {int row=word1.size();int col=word2.size();vector<vector<int>> mindis(row+1,vector<int>(col+1));for(int i=0;i<row+1;i++){mindis[i][0]=i;}//[0][0]位置已经初始化过了for(int j=1;j<col+1;j++){mindis[0][j]=j;}for(int i=1;i<=row;i++){for(int j=1;j<=col;j++){//选择插入或者删除mindis[i][j]=min(mindis[i-1][j],mindis[i][j-1])+1;//替换if(word1[i-1]==word2[j-1])//字符的位置与数组的位置相差一{//如果相等的话,就直接取mindis[i-1][j-1],但是也是需要比较一下的mindis[i][j]=min(mindis[i][j],mindis[i-1][j-1]);}else{//替换和插入删除进行比较,mindis[i-1][j-1]+1因为不相等所以要加一mindis[i][j]=min(mindis[i][j],mindis[i-1][j-1]+1);}}}return mindis[row][col];}
};

在这里插入图片描述

不同的子序列

在这里插入图片描述

class Solution {
public:int numDistinct(string s, string t) {// if (s.length() < t.length()) return 0;// int row=s.size();// int col=t.size();// //vector<vector<int>> dp(row+1,vector<int>(col+1));// vector<vector<unsigned int>> dp(row+ 1, vector<unsigned int>(col + 1, 0));// dp[0][0]=1;// for(int i=1;i<=row;i++)// {//     dp[i][0]=1;//     for(int j=1;j<=col;j++)//     {//         if(s[i-1]==t[j-1])//         {//             dp[i][j]=dp[i-1][j-1]+dp[i-1][j];//         }//         else//         {//             dp[i][j]=dp[i-1][j];//         }//     }// }// return dp[row][col];//下面的方法解释了空间,思想还是一样的if (s.length() < t.length()) return 0;int row=s.size();int col=t.size();//vector<vector<int>> dp(row+1,vector<int>(col+1));vector<unsigned int> dp(row+ 1);dp[0]=1;for(int i=1;i<=row;i++){//为什么要从大到小进行,dp[j-1]+dp[j];是要取上一行的//所以就导致到从后开始,如果从前开始就会导致并不是从上一行当中取值//而是在该行当中取值for(int j=col;j>0;j--){if(s[i-1]==t[j-1]){dp[j]=dp[j-1]+dp[j];}else{dp[j]=dp[j];}}}return dp[col];}
};

在这里插入图片描述

数组当中类型的问题,int,long long,unsigned int

在这里插入图片描述

1、long long比unsigned int表示范围大 2、之所以unsigned int没问题,大概是因为编译器优化了(以下为我根据实测情况下的猜测,测试方法为,给unsigned int对象初始化一个超过上限的值,能正确打印出翻转后的值,但如果这个值非常大,则会报错):unsigned int能接受的实际值超过它的上限,当实际值超过unsigned int上限,会自动翻转(可以理解为取模)变成一个很小的数。 3、long long则不然,因为不能翻转,累加会越来越大,直到爆炸。

动态规划解题思路

动规状态定义:
状态来源:从问题中抽象状态
抽象状态:每一个状态对应一个子问题
状态的形式可以定义很多,如何验证状态的合理性:

1、某一状态的解或者多个状态处理之后解能否对应最终问题的解
2、状态之间可以形成递推关系

一维状态VS二维状态(依据问题和题目线索):

首先尝试一维状态
一维状态的合理性不满足时,再去定义二维状态

常见问题的状态:

字符串:状态一般对应字串,状态中每次一般增加一个新的字符
矩阵:二维状态–》优化—》一维状态(有机会变为一维,并不是肯定)

相关文章:

【算法篇】动态规划(二)

文章目录 分割回文字符串编辑距离不同的子序列动态规划解题思路 分割回文字符串 class Solution { public:bool isPal(string& s,int begin,int end){while(begin<end){if(s[begin]!s[end]){return false;}begin;end--;}return true;}int minCut(string s) {int lens.si…...

数据库 SQL高级查询语句:聚合查询,多表查询,连接查询

目录 创建学生表聚合查询聚合函数直接查询设置别名查询设置条件查询 常用的聚合函数 分组查询单个字段Group by报错分组查询多字段分组查询 多表查询直接查询重命名查询Students表新建一列CourseID 连接&#xff08;JOIN&#xff09;查询INNER JOINRIGHT JOIN, LEFT JOINFULL J…...

pytorch-构建卷积神经网络

构建卷积神经网络 卷积网络中的输入和层与传统神经网络有些区别&#xff0c;需重新设计&#xff0c;训练模块基本一致 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torchvision import datasets,transforms impor…...

点云从入门到精通技术详解100篇-点云滤波算法及单木信息提取(续)

目录 3.3 点云滤波算法原理概述 3.3.1 坡度滤波算法 3.3.2 基于不规则三角网滤波 3.3.3 数学形态学滤波...

Gartner发布中国科技报告:数据编织和大模型技术崭露头角

近日&#xff0c;全球知名科技研究和咨询机构Gartner发布了关于中国数据分析与人工智能技术的最新报告。报告指出&#xff0c;中国正迎来数据分析与人工智能领域的蓬勃发展&#xff0c;预计到2026年&#xff0c;将有超过30%的白领工作岗位重新定义&#xff0c;生成式人工智能技…...

java八股文面试[数据库]——explain

使用 EXPLAIN 关键字可以模拟优化器来执行SQL查询语句&#xff0c;从而知道MySQL是如何处理我们的SQL语句的。分析出查询语句或是表结构的性能瓶颈。 MySQL查询过程 通过explain我们可以获得以下信息&#xff1a; 表的读取顺序 数据读取操作的操作类型 哪些索引可以被使用 …...

Kafka3.0.0版本——增加副本因子

目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、增加副本因子3.1、增加副本因子的概述3.2、增加副本因子的示例3.2.1、创建topic(主题)3.2.2、手动增加副本存储 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节点…...

升级iOS 17出现白苹果、不断重启等系统问题怎么办?

iOS 17发布后了&#xff0c;很多果粉都迫不及待的将iphone/ipad升级到最新iOS17系统&#xff0c;体验新系统功能。 但部分果粉因硬件、软件的各种情况&#xff0c;导致升级系统后出现故障&#xff0c;比如白苹果、不断重启、卡在系统升级界面等等问题。 如果遇到了这些系统问题…...

6. `Java` 并发基础之`ReentrantReadLock`

前言&#xff1a;随着多线程程序的普及&#xff0c;线程同步的问题变得越来越常见。Java中提供了多种同步机制来确保线程安全&#xff0c;其中之一就是ReentrantLock。ReentrantLock是Java中比较常用的一种同步机制&#xff0c;它提供了一系列比synchronized更加灵活和可控的操…...

float浮动布局大战position定位布局

华子目录 布局方式普通文档流布局浮动布局&#xff08;浮动主要针对与black&#xff0c;inline元素&#xff09;float属性浮动用途浮动元素父级高度塌陷 position属性定位篇相对定位&#xff08;relative为属性值&#xff0c;配合left属性&#xff0c;和top属性使用&#xff09…...

算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

1. 插入排序&#xff08;insertion-sort&#xff09;&#xff1a; 是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入 算法稳定性: 对于两个相同的数&#xff0c;经过…...

OpenCV(二十二):均值滤波、方框滤波和高斯滤波

目录 1.均值滤波 2.方框滤波 3.高斯滤波 1.均值滤波 OpenCV中的均值滤波&#xff08;Mean Filter&#xff09;是一种简单的滤波技术&#xff0c;用于平滑图像并减少噪声。它的原理非常简单&#xff1a;对于每个像素&#xff0c;将其与其周围邻域内像素的平均值作为新的像素值…...

二叉树的递归遍历和非递归遍历

目录 一.二叉树的递归遍历 1.先序遍历二叉树 2.中序遍历二叉树 3.后序遍历二叉树 二.非递归遍历(栈) 1.先序遍历 2.中序遍历 3.后序遍历 一.二叉树的递归遍历 定义二叉树 #其中TElemType可以是int或者是char,根据要求自定 typedef struct BiNode{TElemType data;stru…...

JDK17:未来已来,你准备好了吗?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

K8s和Docker

Kubernetes&#xff08;简称为K8s&#xff09;和Docker是两个相关但又不同的技术。 一、Docker 1、Docker是一种容器化平台&#xff0c;用于将应用程序及其依赖项打包成可移植的容器。 2、Docker容器可以在任何支持Docker的操作系统上运行 好处&#xff1a;提供了一种轻量级…...

使用物理机服务器应该注意的事项

使用物理机服务器应该注意的事项 如今云计算的发展已经遍布各大领域&#xff0c;尽管现在的云服务器火遍全网&#xff0c;但是仍有一些大型企业依旧选择使用独立物理服务器&#xff0c;你知道这是为什么吗&#xff1f;壹基比小鑫来告诉你吧。 独立物理服务器托管业务适合大中…...

py脚本解决ArcGIS Server服务内存过大的问题

在一台服务器上&#xff0c;使用ArcGIS Server发布地图服务&#xff0c;但是地图服务较多&#xff0c;在发布之后&#xff0c;服务器的内存持续处在95%上下的高位状态&#xff0c;导致服务器运行状态不稳定&#xff0c;经常需要重新启动。重新启动后重新进入这种内存高位的陷阱…...

Go语言Web开发入门指南

Go语言Web开发入门指南 欢迎来到Go语言的Web开发入门指南。Go语言因其出色的性能和并发支持而成为Web开发的热门选择。在本篇文章中&#xff0c;我们将介绍如何使用Go语言构建简单的Web应用程序&#xff0c;包括路由、模板、数据库连接和静态文件服务。 准备工作 在开始之前…...

保姆级教程——VSCode如何在Mac上配置C++的运行环境

vscode官方下载&#xff1a; 点击官网链接&#xff0c;下载对应的pkg&#xff0c;安装打开&#xff1b; https://code.visualstudio.com/插件安装 点击箭头所指插件商店按钮&#xff0c;yyds&#xff1b; 下载C/C 插件&#xff1b; ![外链图片转存 下载CodeLLDB插件&#x…...

Java 操作FTP服务器进行下载文件

用Java去操作FTP服务器去做下载&#xff0c;本文章里面分为单个下载和批量下载&#xff0c;批量下载只不过多了一层循环&#xff0c;为了方便参考&#xff0c;我代码都贴出来了。 不管单个下载还是多个&#xff0c;一定要记得&#xff0c;远程服务器的直接写文件夹路径&#xf…...

终极指南:buger/jsonparser如何10倍加速处理第三方API不确定性数据

终极指南&#xff1a;buger/jsonparser如何10倍加速处理第三方API不确定性数据 【免费下载链接】jsonparser One of the fastest alternative JSON parser for Go that does not require schema 项目地址: https://gitcode.com/gh_mirrors/js/jsonparser 在处理第三方AP…...

在Ubuntu 20.04上搞定Synopsys SpyGlass 2016:一份针对高内核版本的详细避坑指南

在Ubuntu 20.04上搞定Synopsys SpyGlass 2016&#xff1a;一份针对高内核版本的详细避坑指南 当IC设计工程师遇到Ubuntu 20.04与SpyGlass 2016的版本冲突时&#xff0c;那种熟悉的挫败感往往伴随着终端里红色的报错信息一起涌现。这不是简单的"安装-运行"问题&#x…...

usearch的内存泄漏自动化测试:在CI中集成泄漏检测

usearch的内存泄漏自动化测试&#xff1a;在CI中集成泄漏检测 【免费下载链接】usearch Fastest Open-Source Search & Clustering engine for Vectors & &#x1f51c; Strings in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoLang, and Wolf…...

显卡驱动深度清理指南:用DDU解决驱动残留难题

显卡驱动深度清理指南&#xff1a;用DDU解决驱动残留难题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 你是…...

祝贺电影《得闲谨制》荣获2026亚洲艺术电影节 六项提名

电影《得闲谨制》荣获2026亚洲艺术电影节「金海燕奖」主竞赛单元六项提名&#xff1a; 祝贺导演孔笙 提名最佳导演&#xff1b; 祝贺编剧伍千万里四十八 提名最佳编剧&#xff1b; 祝贺演员肖战 提名最佳男主角&#xff1b; 祝贺演员尹正 提名最佳男配角&#xff1b; 祝贺美术指…...

Graphormer图神经网络效果展示:含手性中心/立体异构体分子的预测能力验证

Graphormer图神经网络效果展示&#xff1a;含手性中心/立体异构体分子的预测能力验证 1. 模型概述 Graphormer是一种基于纯Transformer架构的图神经网络&#xff0c;专门为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测而设计。该模型在OGB&#xff08…...

ROS 实战指南:从 rosbag 高效提取 RGB 与深度图数据

1. rosbag基础操作与核心概念 在机器人开发领域&#xff0c;rosbag就像是一个万能的数据记录仪。想象一下你正在调试一个机器人视觉系统&#xff0c;传感器数据像流水一样不断涌来&#xff0c;这时候rosbag就能帮你把关键数据"冻住"&#xff0c;方便后续反复分析。我…...

弦音墨影保姆级教程:解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题

弦音墨影保姆级教程&#xff1a;解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题 1. 系统简介与核心价值 「弦音墨影」是一款将人工智能技术与传统美学完美融合的视频分析工具。它采用水墨丹青的视觉风格&#xff0c;通过先进的Qwen2.5-VL多模态技术&#xff0c;让视频…...

深度学习音高检测:5个技巧掌握CREPE实时音高追踪

深度学习音高检测&#xff1a;5个技巧掌握CREPE实时音高追踪 【免费下载链接】crepe CREPE: A Convolutional REpresentation for Pitch Estimation -- pre-trained model (ICASSP 2018) 项目地址: https://gitcode.com/gh_mirrors/cr/crepe CREPE&#xff08;Convoluti…...

告别布局跳动!Android Dialog+EditText+软键盘的终极适配指南(含Kotlin代码)

Android Dialog软键盘适配全攻略&#xff1a;从布局跳动到完美交互 在Android开发中&#xff0c;Dialog与软键盘的交互一直是让开发者头疼的问题。当EditText获得焦点时&#xff0c;弹出的软键盘经常会遮挡输入框或导致布局跳动&#xff0c;严重影响用户体验。本文将深入探讨Di…...