LCS
一开始我是逆推,发现不行,就多加了一层循环,可是超时。
后来正推,就过了
状态转移方程
if(a[i]==b[j])
dp[i][j]=dp[i-1][j-1];
else
dp[i][j]=max(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]);
#include<iostream>
#include<cstring>
using namespace std;
int dp[1005][1005];
int max(int a,int b,int c)
{
if(a<b)
swap(a,b);
if(a<c)
swap(a,c);
return a;
}
int main()
{
string a,b;
int i,j,k;
while(cin>>a>>b)
{
memset(dp,0,sizeof(dp));
a.insert(0," ");
b.insert(0," ");
int l1=a.size();
int l2=b.size();
for(i=1;i<l1;i++)
{
for(j=1;j<l2;j++)
{
if(a[i]==b[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]);
}
}
cout<<dp[l1-1][l2-1]<<endl;
}
return 0;
}