DP(动态规划)【3】 最长公共子序列 最长回文子串

news2024/10/6 18:36:09

目录

1.最长公共子序列

状态转移方程需要二维数组,1-dim已经不太够了

又是这个问题:如何读入字符串

2.最长回文子串


1.最长公共子序列

状态转移方程需要二维数组,1-dim已经不太够了

这里dp[i][j]是说S的前i位与T的前j位公共序列,所以前i位是下标至i-1位置(≤,闭)

所以,最后是到dp[lenA][lenB].

同时,判断时,要s[i-1]==t[j-1]。注意向左偏移一位

又是这个问题:如何读入字符串

答案用的是cin>>#string

再次参照之前的

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int N=102,maxn=10;int n,m,k,dp[N][N]={0};
char str1[N],str2[N];
int main()
{
	scanf("%s",str1);
	scanf("%s",str2);
	int l1=strlen(str1);
	int l2=strlen(str2);
	int ans=0;

for(int i=0;i<=l1;i++) dp[i][0]=0;
for(int i=0;i<=l2;i++) dp[0][i]=0;

for(int i=1;i<=l1;i++)
{for(int j=1;j<=l2;j++)
{
if(str1[i-1]!=str2[j-1]) //注意这里要偏移一位 
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
else dp[i][j]=dp[i-1][j-1]+1;
}
}
printf("%d",dp[l1][l2]);
	
	
}
 

所以可以scanf("%s",#cstring) 

读取字符串长度?

试一波

2.最长回文子串

状态:仍然是二维数组,dp[i][j]是从i位到j位是否是回文串

如何遍历?

不像上题,直接fori=0……forj=0

应该是第一憧循环表示子串长度,依次遍历长度为3,4,……的所有子串(实现写好长度为1&2的边界条件),然后更新ans

转移方程

if str【j】=str【j+i-1】

&& dp【i+1】【i+j-2】

则dp【i】【j】=1;

代码

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int N=102,maxn=10;int n,m,k,dp[N][N]={0};
char str[N],str2[N];
int main()
{
	scanf("%s",str);
	int l1=strlen(str);
	int ans=1;

for(int i=0;i<l1;i++) dp[i][i]=1;
//for(int i=0;i<l1;i++)
//{for(int j=0;j<l1;j++)
//{printf("-%d-",dp[i][j]);
//
//
//}
//printf("\n");
//}
//

for(int i=0;i<l1-1;i++)
{dp[i][i+1]=int(str[i]==str[i+1]);
 dp[i+1][i]=int(str[i+1]==str[i]);
 if(str[i]==str[i+1]) ans=2;
 //printf("*%d*",dp[i][i+1]);
}



for(int i=3;i<=l1;i++)//枚举长度 
{for(int j=0;j+i-1<=l1-1;j++)//枚举长度为i的子串 
{
if(str[j]==str[j+i-1])
{if(dp[j+1][j+i-1-1]) 
{dp[j][j+i-1]=1;
ans=i;//printf("?"); 

}
}
//lozjujzve

}
}
//
//for(int i=0;i<l1;i++) dp[i][i]=1;
//for(int i=0;i<l1;i++)
//{for(int j=0;j<l1;j++)
//{printf("-%d-",dp[i][j]);
//
//
//}
//printf("\n");
//}

printf("%d",ans);
	
	
}
 

强调一下,不能对s和s[::-1]求最长公共子序列,我一直以为是可以的

理由如下:

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

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

相关文章

数据库期末,一篇就够了!【全面】【期末考试】

1. 数据库系统概论 数据库3个特点&#xff1a;永久存储&#xff0c;有组织&#xff0c;可共享 数据库管理技术&#xff1a; 人工管理&#xff1a;无专门的软件&#xff0c;数据不共享&#xff0c;程序与数据不具有独立性 文件系统管理&#xff1a;有专门用于管理数据的应用软…

【python - 数据】

一、序列 序列&#xff08;sequence&#xff09;是一组有顺序的值的集合&#xff0c;是计算机科学中的一个强大且基本的抽象概念。序列并不是特定内置类型或抽象数据表示的实例&#xff0c;而是一个包含不同类型数据间共享行为的集合。也就是说&#xff0c;序列有很多种类&…

345亿!博世这次瞄上另一家制造业巨头了,打不过就买下它~

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 汽车零部件巨头博世近日传出收购风声&#xff0c;其目标直指美国家电制造巨头惠而浦。尽管尚未有确切消息证实收购要约的提出&#xff0c;但这一…

OFDM技术简介——背景

l 1966 年&#xff0c; R. W. Chang 提出在带限信道中用 正交信号 同时传输 多路数据 的原理&#xff0c;同时这种传输方式保证系统中不存在符号间串扰和子信道间干扰&#xff0c;该技术可以有效提高频谱利用率&#xff0c;可以有效对抗信道多径衰落。 l 1971 年&#xff0c; …

LLM应用开发-RAG系统评估与优化

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;在上一篇文章中&#xff0c;我们学习了如何基于LangChain构建RAG应用&#xff0c;并且通过Streamlit将这个RAG应用部署到了阿里云服务器&#xff1b;&am…

【Qt知识】Geometry属性

一、走进Geometry的世界 Geometry属性是Qt框架中用于处理和操作几何形状的一系列类的集合。它包括了QPoint、QPointF、QSize、QSizeF、QRect和QRectF等。这些类分别代表点、大小、矩形等基本几何概念&#xff0c;它们的存在让图形界面的创建变得既简单又直观。 位置和尺寸。 其…

DCS-11双位置继电器 DC220V 板前接线带底座 约瑟 JOSEF

系列型号&#xff1a; DCS-11双位置继电器&#xff1b; DCS-12双位置继电器&#xff1b; DCS-13双位置继电器&#xff1b; ​用途 RXMVB2(DCS-10)系列双位置继电器用于需要大容量双稳态触点的工业控制和其它一般控制场合。 特点 体积小&#xff0c;拆装方便&#xff0c;能安…

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

法一&#xff1a;第一次安装宝塔 第一次安装宝塔mysql服务是默认关闭的&#xff0c;需要手动打开&#xff0c;打开服务再次进入phpMyAdmin发现可以进入了 法二&#xff1a;第一种方法没解决用这种 出现mysqli::real_connect(): (HY000/2002): No such file or directory错误通…

java spring 拦截器和过滤器+过滤器处理数据

java spring 拦截器和过滤器过滤器处理数据 介绍Spring拦截器&#xff08;Interceptor&#xff09;导入依赖完整代码 Java过滤器&#xff08;Filter&#xff09;完整代码分为 2 个文件&#xff0c;请看下面BodyReaderHttpServletRequestWrapper.javaMyFilter.java Spring过滤器…

昇思25天学习打卡营第6天|linchenfengxue

​​​​​​SSD目标检测 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)以…

网络编程常见问题

1、TCP状态迁移图 2、TCP三次握手过程 2.1、握手流程 1、TCP服务器进程先创建传输控制块TCB&#xff0c;时刻准备接受客户进程的连接请求&#xff0c;此时服务器就进入了LISTEN&#xff08;监听&#xff09;状态&#xff1b; 2、TCP客户进程也是先创建传输控制块TCB&#xff…

操作系统期末复习考题三(不挂科系列)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文☀️☀️☀️三、总结&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&am…

【操作系统期末速成】 EP03 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点五&#xff1a;进程的概念及特征2.1 考点六&#xff1a;进程的状态与切换 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动…

isalnum()方法——判断字符串是否由字母和数字组成

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isalnum()方法用于判断字符串是否由字母和数字组成。isalnum()方法的语法格式如下&#xff1a; str.isalnum() 如果字符串中至少有一个字…

install nebula with source

linux 环境&#xff1a;ubuntu 2004 默认gcc 7.5 nebula requerment&#xff1a; g 8.5 above 下载source git clone --branch release-3.8 https://github.com/vesoft-inc/nebula.git install gcc g 11 apt install gcc-11 g-11 此时 linux环境存在多个版本gcc&#xff1a…

运算放大器(运放)带宽和带宽平坦度

运算放大器带宽和带宽平坦度 电压反馈型运算放大器的带宽 下图1显示电压反馈型运算放大器的开环频率响应。有两种可能&#xff1a;图1A是最常见的情况&#xff0c;高直流增益以6dB/倍频程从极低频率下降至单位增益&#xff0c;也就是典型的单极点响应。相比之下&#xff0c;图…

快速降低地平线4延迟 极限竞速地平线4延迟严重这样做

极限竞速地平线4全新的开放式剧情设计&#xff0c;让玩家的每一次驾驶都充满了未知与挑战。与此同时&#xff0c;现实世界的玩家也将与玩家一同在这片土地上驰骋。在这里&#xff0c;时间、天气和四季的变化都仿佛触手可及&#xff0c;玩家将亲身体验到真实而震撼的赛车世界。在…

使用青否数字人直播软件有哪些优势?

使用青否数字人主播主要具有以下优势&#xff1a; 1、降低直播门槛 在垂直程度较高、专业度更强的行业&#xff0c;面对相关品牌们“专业主播难培养”的问题。数字人主播的学习技能和灵活优势尽显。通过数字人直播可以借助知识库配置与AI能力&#xff0c;快速获得技术性知识&am…

【数据结构|C语言版】四大排序(算法)

前言1. 插入排序1.1 直接插入排序1.2 希尔排序 2. 选择排序2.1 选择排序2.2 堆排序 3. 交换排序3.1 冒泡排序冒泡排序的步骤 3.2 快速排序快速排序的步骤 4. 归并排序归并排序的步骤&#xff1a;代码解释&#xff1a;归并排序的性能&#xff1a; 上期回顾: 【数据结构|C语言版】…

计算几何系列——XCPC中计算几何一些题型杂谈(中)

本系列文章力求以简洁易懂的文字介绍计算几何中的基本概念&#xff0c;使读者快速入门&#xff0c;故不追求难度和深度&#xff0c;仅起到抛砖引玉的作用。 在XCPC中有一种题叫计算几何&#xff0c;这类题在大多数时候都作为一类金牌题甚至防AK题的难度出现&#xff0c;但是在…