状态:dp[i][j]用来描述字符串a的前i个字符与字符串的前j个字符的最大公共子序列。
状态转移:
如果a[i] == b[j],dp[i][j] = dp[i-1][j-1]+1;
否则dp[i][j] = max(dp[i-1][j] , dp[i][j-1]);
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define SIZE 1000
char a[SIZE],b[SIZE];
int common[SIZE][SIZE];
int dfs(int x, int y)
{
cout<<x<<' '<<y<<endl;
if(x==0||y==0)
return 0;
if(a[x] == b[y])
return common[x][y] = dfs(x - 1,y - 1) + 1;
else
return common[x][y] = max(dfs(x, y - 1), dfs(x - 1, y));
}
int main()
{
while(cin>>a+1>>b+1)
{
memset(common,0,sizeof(common));
a[0] = b[0] ='l';
//要从i==1,j==1开始递推,因此a[0],b[0]必须要空出来;如果不赋初值可能会导致字符串意外中断
int la = strlen(a), lb = strlen(b);
for(int i = 1; i< la;i++)
for(int j = 1; j< lb;j++)
if(a[i]==b[j])
common[i][j] = common[i-1][j-1]+1;
else
common[i][j] = max(common[i-1][j],common[i][j-1]);
cout<<common[la-1][lb-1]<<endl;
}
return 0;
}