- P1051 最长公共子序列
- P1052 最长公共字串
- P3636 三个序列的最长公共子序列
f[i][j]表示一号序列的第 i 位和二号序列的第 j 位
把两个字序列/字串一位一位去比较,若出现相同的一位则 f[i][j]在f[i-1][j-1] 的基础上长度+1,否则取前面长度的最大值,长度不变;
模板题,很简单;
- #include
- using namespace std;
- int n,m;
- int a[505],b[505];
- int f[505][505];
- int main(){
- cin>>n>>m;
- for(int i=1;i<=n;i++){
- cin>>a[i];
- }
- for(int i=1;i<=m;i++){
- cin>>b[i];
- }
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- if(a[i]==b[j]){
- f[i][j]=f[i-1][j-1]+1;
- }else{
- f[i][j]=max(f[i-1][j],f[i][j-1]);
- }
- }
- }
- cout<
- return 0;
- }
P1052 最长公共字串
注意字串要求连续,所以f[i][j]在 a串与b串不连续时取0这个值,ans为f数组中的最大值;
- #include
- using namespace std;
- int n,m,ans=0;
- int a[505],b[505];
- int f[505][505];
- int main(){
- cin>>n>>m;
- for(int i=1;i<=n;i++){
- cin>>a[i];
- }
- for(int i=1;i<=m;i++){
- cin>>b[i];
- }
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- f[i][j]=0;
- if(a[i]==b[j]){
- f[i][j]=f[i-1][j-1]+1;
- }
- ans=max(ans,f[i][j]);
- }
- }
- cout<
- return 0;
- }
P3636 三个序列的最长公共子序列
直接开个三维数组,按照模板扩充出第三位的判断即可;
- #include
- using namespace std;
- int x,y,z;
- int a[505],b[505],c[205];
- int f[205][205][205];
- int main(){
- cin>>x>>y>>z;
- for(int i=1;i<=x;i++){
- cin>>a[i];
- }
- for(int i=1;i<=y;i++){
- cin>>b[i];
- }
- for(int i=1;i<=z;i++){
- cin>>c[i];
- }
- for(int i=1;i<=x;i++){
- for(int j=1;j<=y;j++){
- for(int k=1;k<=z;k++){
- f[i][j][k]=0;
- if(a[i]==b[j]&&b[j]==c[k]){
- f[i][j][k]=f[i-1][j-1][k-1]+1;
- }else{
- f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);
- f[i][j][k]=max(f[i][j][k],f[i][j][k-1]);
- }
- }
- }
- }
- cout<
- return 0;
- }
看到这里了,给个三连不过分吧;
-
相关阅读:
【MySQL】索引 详解
【算法】分治法的应用——快速排序
Kotlin 进阶 学习 委托
流媒体传输 - HLS 协议
python毕业设计项目源码选题(20)教室图书馆座位预约系统毕业设计毕设作品开题报告开题答辩PPT
[JavaScript]函数进阶,解构赋值,js垃圾回收机制,闭包,变量提升,函数提升
2022VLMo: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts
Ubuntu22下载安装
香港金融科技周VERTU CSO Sophie谈Web3.0的下一个风口 手机虚拟货币移动支付
springBoot框架简介入门教程(快速学习版)
-
原文地址:https://blog.csdn.net/Kochakin/article/details/126202338