#include
<cmath>
#include
<cstdio>
#include
<vector>
#include
<iostream>
#include
<algorithm>
using
namespace std;
void lcsutil (vector <int> & first, vector <int>
& second, vector <vector <int> > & arr) {
int m = first.size();
int n = second.size();
for (int i = 0; i <= n; i++) {
arr[0][i] = 0;
}
for (int i = 0; i <= m; i++){
arr[i][0] = 0;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (first[i-1] == second[j-1]) {
arr[i][j] = arr[i-1][j-1] + 1;
} else if (arr[i-1][j] >= arr[i][j-1]) {
arr[i][j] = arr[i-1][j];
} else if (arr[i][j-1] > arr[i-1][j]){
arr[i][j] = arr[i][j-1];
}
}
}
int index = arr[m][n];
vector <int> longest (index);
index--;
int i = m;
int j = n;
while (i > 0 & j > 0) {
if (first[i-1] == second[j-1]) {
longest[index] = first[i-1];
index--;
i--;
j--;
} else if (arr[i-1][j] > arr[i][j-1]) {
i--;
} else {
j--;
}
}
for (int i = 0; i < arr[m][n]; i++){
cout<<longest[i]<<" ";
}
}
int
main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT
*/
unsigned int m, n;
cin>>m>>n;
vector < int > first(m);
vector < int > second(n);
for (int i = 0; i < m; i++) {
cin>>first[i];
}
for (int i = 0; i < n; i++) {
cin>>second[i];
}
vector < vector <int> > arr ( m + 1 , vector <int> (n
+ 1));
lcsutil (first, second, arr);
return 0;
}
No comments:
Post a Comment