算法基础之最长公共子序列
2023-12-25 23:39:13
最长公共子序列
-
核心思想: 线性dp
-
集合定义 : f[i][j]存 a[1 ~ i] 和 b[1 ~ j] 的最长公共子序列长度
-
状态计算: 分为取/不取a[i]/b[j] 共四种情况
- 其中 中间两种会包含两个都不取的情况(去掉) 但是因为取最大值 有重复也没事
- 用f[i-1][j] 和 f[i][j-1]表示取一个的情况即可 如果是求和 则必须去掉重复部分
-
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N = 1010; int n,m; char a[N],b[N]; int f[N][N]; int main() { cin>>n>>m>>a+1>>b+1; //从1开始存ab for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { f[i][j] = max(f[i-1][j] , f[i][j-1]); //中间两种情况是必定存在的 if(a[i] == b[j]) f[i][j] = max(f[i][j] , f[i-1][j-1] +1); //a[i]=b[j] 才有最后一种情况 } } cout<<f[n][m]; }
-
文章来源:https://blog.csdn.net/Pisasama/article/details/135211034
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!