问题描述:给两个子序列A和B,求长度最长的公共子序列,如1,5,2,6,8,7和2,3,5,6,9,8,4的最长公共子序列为5,6,8另一个解为2,6,8求出这样的子序列最长是多少?
状态转移方程:对A1,A2…Ai和B1,B2,…Bj
当A[i]==B[j]时,d(i,j)=d(i-1,j-1)+1
否则d(i,j) = max{d(i-1,j),d(i,j-1)}
具体实现的时候要注意i,j从0开始时不要数组越界,那么可以用d(i+1,j+1)=d(i,j)+1的方式来防止或者从i=1,j=1开始遍历,反正d[]的初始值为0.
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
using namespace std;
const int maxn = 1005;
int dp[maxn][maxn];
int main()
{
int num = 0;
cin >> num;
while (num--)
{
string A, B;
cin >> A >> B;
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= A.length();i++)
for (int j = 1; j <= B.length(); j++)
{
if (A[i-1] == B[j-1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
cout<< dp[A.length()][B.length()]<<endl;
}
return 0;
}