ACM POJ 1458 Common Subsequence
2014-09-23 01:16
169 查看
题目大意:输入两个字符串,求出最长公共子序列的长度。
算法思想
DP
用c[][]存储a[]与b[]的最长公共子序列长度。递归方程 c[i][j]= 0 i or j =0
= c[i-1][j-1] +1 if a[i]==b[j]
= max{c[i-1][j],c[i][j-1]} a[i]!=b[j]
代码如下
算法思想
DP
用c[][]存储a[]与b[]的最长公共子序列长度。递归方程 c[i][j]= 0 i or j =0
= c[i-1][j-1] +1 if a[i]==b[j]
= max{c[i-1][j],c[i][j-1]} a[i]!=b[j]
代码如下
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; const int MAX=1000; int c[MAX][MAX]; void LCS(char a[],char b[],int m,int n){ for(int i=0;i<=m;i++){ c[i][0]=0; } for(int j=0;j<=n;j++){ c[0][j]=0; } for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(a[i]==b[j]) c[i][j]=c[i-1][j-1]+1; else if(c[i-1][j]>c[i][j-1]) c[i][j]=c[i-1][j]; else c[i][j]=c[i][j-1]; } } } int main(){ char a[MAX],b[MAX]; while(scanf("%s%s",a,b)!=EOF){ int m=strlen(a); int n=strlen(b); for(int i=m;i>=0;i--){ a[i+1]=a[i]; } for(int i=n;i>=0;i--){ b[i+1]=b[i]; } LCS(a,b,m,n); cout<<c[m] <<endl; } return 0; }
相关文章推荐
- [ACM] poj 1496 Word Index(组合计数)
- POJ-1458 Common Subsequence ( DP )
- 文章标题 POJ 1458 : Common Subsequence (最长公共子序列)
- poj1458解题报告
- ACM训练方案-POJ题目分类
- POJ 1458(dp)
- poj 1458 Common Subsequence -- 最长公共子序列
- HDU1159 && POJ1458 Common Subsequence (LCS)
- ACM POJ 2356
- [ACM] POJ 3686 The Windy's (二分图最小权匹配,KM算法,特殊建图)
- [ACM] poj 3468 A Simple Problem with Integers(线段树,成段更新,懒惰标记)
- POJ - 1458----Common Subsequence
- poj1458--Common Subsequence--最长公共子序列LCS
- poj 1458 Common Subsequence(lcs)
- POJ 3436 ACM Computer Factory 最大流
- 【ACM】poj_1579_Function Run Fun_201308121654
- POJ 1458 && HDU 1159 Common Subsequence (最長公共子序列)dp
- [An AC a day]1050_POJ_ACM
- ACM: 方向dfs + bfs求最短路 poj 3…
- ACM: 模拟队列判定 poj 1426