模板 - 最长公共子序列
2015-08-21 15:36
113 查看
最长公共子序列
#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> using namespace std; string str; char s1[1000], s2[1000]; int dp[1000][1000], mark[1000][1000];///数据太大,dp数组变成滚动数组 int LCS() { int i, j, n, m; memset(dp,0,sizeof(dp)); n = strlen(s1); m = strlen(s2); for(i = 0; i <= n; i++) mark[i][0] = 1; for(i = 0; i <= m; i++) mark[0][i] = -1; for(i = 1; i <= n; i++) { for(j = 1; j <= m; j++) { if(s1[i-1] == s2[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; mark[i][j] = 0; } else if(dp[i-1][j] >= dp[i][j-1]) { dp[i][j] = dp[i-1][j]; mark[i][j] = 1; } else { dp[i][j] = dp[i][j-1]; mark[i][j] = -1; } } } return dp [m]; } void SameLCS(int i,int j)///mark[i][j] == 1表示s1序列的,mark[i][j] == -1表示s2序列的 { if(!i && !j) return ; if(mark[i][j] == 0)///公共序列 { SameLCS(i-1,j-1); str += s1[i-1]; } else if(mark[i][j] == 1) SameLCS(i-1,j); else SameLCS(i,j-1); } int main() { while(~scanf("%s %s",s1,s2)) { int ans, len1, len2; len1 = strlen(s1); len2 = strlen(s2); ans = LCS(); printf("%d\n",ans); SameLCS(len1,len2); cout << str << endl; } return 0; }
相关文章推荐
- 黑马程序员-[C语言-指针和文件操作]学习日记(四)
- POJ1088滑雪(记忆化搜索+DFS||经典的动态规划)
- appium安装
- oralce11g agent与oms无法连接
- TCP/IP-链路层
- 输出货币值
- jmc监控工具
- Linux 错误:fatal error: uuid/uuid.h: No such file or directory
- Android应用程序组件(二)
- Invert Binary Tree(翻转二叉树)
- 在C#中调用格式工厂进行任意视频格式到FLV的转换
- Execution failed for task ':app:compileDebugNdk'
- [2016实习] 摩根大通-量化金融-北京
- jquery实现叠层3D文字特效代码分享
- 通过rsync远程增量备份(差异备份)
- mysql--------InnoDB和MyISAM的区别
- 关于android:id="@+id/xx"的理解
- 角度来分析 腾讯 一些游客微通道系统问题 (一个)
- android 进程间通信数据(一)------parcel的起源
- c#**************