题目:
abcfbc abfcab programming contest abcd mnp
4 2 0
大意:输入两串字符串。。求他们的最长相同的子序列,不需要连续,但必须要有前后顺序,就比如abcfbc abfcab 这两串最长的相同子序列是abcb或abfb,最大长度为4。。
思路:a[i]代表第一串字符串的第i+1个字符
同理b[i]。。
c[i][j]代表第一串的前i个字符和第二串的前j个字符最长的相同子序列
动态规划方程:
if(a[i-1] == b[j-1])
c[i][j] = c[i-1][j-1] + 1;
else if(c[i][j-1] >= c[i-1][j])
c[i][j] = c[i][j-1];
else
c[i][j] = c[i-1][j];
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int main()
{
//freopen("r.txt","r",stdin);
string s;
string t;
int i;
while(cin>>s>>t)
{
const char* a = s.c_str();
const char* b = t.c_str();
int m = strlen(a) + 1;
int n = strlen(b) + 1;
int** c = new int*[m];
for(i = 0; i < m; i++)
c[i] = new int[n];
for(i = 0; i < m; i++)
c[i][0] = 0;
for(i = 0; i < n; i++)
c[0][i] = 0;
for(i = 1; i < m; i++)
for(int j = 1; j < n; j++)
{
if(a[i-1] == b[j-1])
c[i][j] = c[i-1][j-1] + 1;
else if(c[i][j-1] >= c[i-1][j])
c[i][j] = c[i][j-1];
else
c[i][j] = c[i-1][j];
}
cout<<c[m-1][n-1]<<endl;
}
return 0;
}
感想:。。。。。好难啊。。。。。