1.什么是最长公共子序列LCS
给定两个序列X和Y,称序列Z是X和Y的公共子序列,如果Z既是X的一个字序列,又是Y的一个子序列,长度最长的那一个就是我们所说的LCS(Longest-Common-Subsequent)。
例如:X ={A,B,C,B,D,A,B},Y={B,D,C,A,B,A} 。{B,C,A}是他们的一个子序列,但是不LCS。因为LCS得长度为4,如{B,C,B,A}、{B,D,A,B}。
2.POJ1458-求LCS长度
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16895 | Accepted: 6509 |
Description
Input
Output
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
#include
#include
#include
using namespace std;
int main()
{
string s1,s2;
int len1,len2,i,j;
while( cin>>s1>>s2){
len1= s1.length();
len2 = s2.length();
int **table = new int *[len1+1];
for( i = 0; i <= len1; i++) table[i] = new int[len2+1];
for( i = 0; i <= len1; i++) table[i][0] = 0;
for( j= 0; j <= len2; j++) table[0][j] = 0;
for( i = 1; i <= len1; i++){
for( j = 1; j <= len2; j++){
if( s1[i-1] == s2[j-1])
table[i][j] = table[i-1][j-1] + 1;
else
table[i][j] =max( table[i][j-1] , table[i-1][j]);
}
}
cout<}
return 0;
}
3.POJ2250-求LCS
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 2423 | Accepted: 1164 | Special Judge |
Description
Input
Output
Sample Input
die einkommen der landwirte sind fuer die abgeordneten ein buch mit sieben siegeln um dem abzuhelfen muessen dringend alle subventionsgesetze verbessert werden # die steuern auf vermoegen und einkommen sollten nach meinung der abgeordneten nachdruecklich erhoben werden dazu muessen die kontrollbefugnisse der finanzbehoerden dringend verbessert werden #
Sample Output
die einkommen der abgeordneten muessen dringend verbessert werden
#include
#include
#include
using namespace std;
int main()
{
string s1[101],s2[101],result[101];
int table[101][101],opt[101][101];
while( cin>>s1[0]){
int len1 = 1,len2 = 1;
while( s1[len1-1] != "#")
cin>>s1[len1++];
--len1;
cin>>s2[0];
while( s2[len2-1] != "#")
cin>>s2[len2++];
--len2;
int i,j;
for( i = 0; i <= len1; i ++) table[i][0] = 0;
for( j =0; j <= len2; j++) table[0][j] = 0;
for( i = 1; i <= len1; i++){
for( j = 1; j <= len2; j++){
if( s1[i-1] == s2[j-1]){
table[i][j] = table[i-1][j-1] + 1;
opt[i][j] = 0;
}else{
if( table[i][j-1] >= table[i-1][j]){
table[i][j] = table[i][j-1];
opt[i][j] = 1;
}else{
table[i][j] = table[i-1][j];
opt[i][j] = 2;
}
}
}
}
int n = table[len1][len2];
cout<int p = n;
i = len1;
j = len2;
while( n){
while( opt[i][j]){
if( opt[i][j] == 1) --j;
else --i;
}
--n;
--i;
--j;
result[n] = s1[i];
}
for( i = 0; i < p-1 ; i++){
cout<}
cout<}
return 0;
}