LCS:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
char str1[100];
char str2[100];
int dp[1000][1000],path[1000][1000];
vector<char> res;
void LIS_len(int lx,int ly)
{
memset(dp,0,sizeof dp);
for(int i=1;i<=lx;i++)
for(int j=1;j<=ly;j++){
if(str1[i-1]==str2[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
path[i][j]=0;
}
else{
if(dp[i-1][j]>=dp[i][j-1])
{
dp[i][j]=dp[i-1][j];
path[i][j]=1;
}
else
{
dp[i][j]=dp[i][j-1];
path[i][j]=-1;
}
}
}
cout<<dp[lx][ly]<<endl;
}
void LIS_print(int lx,int ly)
{
if(lx==0||ly==0)
return;
if(path[lx][ly]==0)
{
res.push_back(str1[lx-1]);
LIS_print(lx-1,ly-1);
}
else if(path[lx][ly]==-1)
{
LIS_print(lx,ly-1);
}
else
LIS_print(lx-1,ly);
}
int main()
{
res.clear();
cin.getline(str1,100);
cin.getline(str2,100);
int lx=strlen(str1);
int ly=strlen(str2);
LIS_len(lx,ly);
LIS_print(lx,ly);
for(int i=res.size()-1;i>=0;i--)
printf("%c ",res[i]);
return 0;
}
LIS:
背包问题:
详见《背包九讲》