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

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...