题意:看上面题目。。
思路:普通lcs就不讲了哈,我们讲一下如何输出路径,其实就是再开一个记录数组,记录他是从哪里转移过来的就好了
代码:
#include <bits/stdc++.h>
using namespace std;
int dp[1111][1111],vis[1111][1111];
int main()
{
string ch,sh;
cin>>ch>>sh;
memset(vis,0,sizeof(vis));
int lenc = ch.size();
int lens = sh.size();
for(int i = 0 ; i < lenc ; i++)
{
for(int j = 0 ; j < lens ; j++)
{
if(ch[i] == sh[j])
{
dp[i+1][j+1] = dp[i][j] + 1;
vis[i+1][j+1] = 1;//如果从斜上方来就是1
}
else
{
if(dp[i][j+1] < dp[i+1][j])
{
dp[i+1][j+1] = dp[i+1][j];
vis[i+1][j+1] = 2;
}
else
{
dp[i+1][j+1] = dp[i][j+1];
vis[i+1][j+1] = 3;
}
}
}
}
string ans;
int i = lenc,j = lens;
while(1)
{
if(i<0||j<0) break;
if(vis[i][j] == 1)
{
ans+=ch[i-1];
i--,j--;
}
else if(vis[i][j] == 2)
{
j--;
}
else i--;
}
for(int i = ans.size()-1; i>=0 ;i--)
{
cout<<ans[i];
}
puts("");
}
/*
2
7
2 1 3 7 9 8 2
*/