当前位置: 首页 > 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…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...