【最长公共子序列】(LCS)
来源:互联网 发布:vision是什么软件 编辑:程序博客网 时间:2024/06/14 06:36
按顺序走,如果不相等就向左或那个方向走右走,当然说向哪儿走就都向
/*LCSBDCABAABCBDABdp[1][2] = 1dp[1][1] = 0dp[2][1] = 0//子串:连续//子序列:可以不连续 // LCSdp[i][j]//第一个字符串在第i个字符前且第二个串在第j个字符前可构成的最长子序列的长度 dp[i][j] = 0 i=0 || j=0 dp[i-1][j-1]+1 str1[i]==str2[j] max(dp[i-1][j],dp[i][j-1]) str1[i]!=str2[j]*/#include<cstdio>#include<cstring>#include<stack>#include<algorithm>using namespace std;int main(){ char str1[20]; char str2[20]; scanf ("%s %s",str1+1,str2+1); //从一开始 str1[0] = str2[0] = '0'; int l1 = strlen(str1)-1; int l2 = strlen(str2)-1; int dp[20][20] = {0};//0 i=0 || j=0 for (int i = 1 ; i <= l1 ; i++) { for (int j = 1 ; j <= l2 ; j++) { if (str1[i] == str2[j])//dp[i-1][j-1]+1 str1[i]==str2[j] dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i-1][j],dp[i][j-1]); //max(dp[i-1][j],dp[i][j-1]) str1[i]!=str2[j] } }//已经求出来了个数 //回溯求LCS //输出 int pos1 = l1; int pos2 = l2; stack<char> S; while (pos1 > 0 && pos2 > 0) { if (str1[pos1] == str2[pos2]) { S.push(str1[pos1]); pos1--; pos2--; } else if (dp[pos1-1][pos2] > dp[pos1][pos2-1]) pos1--; else pos2--; } while (!S.empty()) { printf ("%c%c",S.top(),(S.size() == 1) ? '\n' : ' '); S.pop(); } printf ("%d\n",dp[l1][l2]); //相同的有几个 return 0;}
阅读全文
0 0
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)问题
- 最长公共子序列(LCS)问题
- 求最长公共子序列(LCS)
- 最长公共子序列算法(LCS)
- LCS(最长公共子序列)
- 最长公共子序列(LCS)问题
- 最长公共子序列(LCS问题)
- Coincidence(LCS最长公共子序列)
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)问题
- 最长公共子序列(LCS)问题
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)
- hdu1243 最长公共子序列(LCS)
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)问题
- new/delete,new[]/delete[],malloc,free
- 布局视图实现点击波纹效果
- 文件下载
- Windows下使用Visual Studio 2010 编译ffmpeg全过程
- 静态通讯录
- 【最长公共子序列】(LCS)
- 关于烂代码的那些事(上)
- 杭电acm 1418 (抱歉) 欧拉公式
- Linux上Oracle 11g安装步骤图解
- 使用maven完成slf4j的配置
- ISwipeRefreshLayout
- 简单矩阵转置
- Git常用操作总结
- javase基础01