mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-09-05 17:50:36 +00:00
81 lines
1.9 KiB
C++
81 lines
1.9 KiB
C++
#include <algorithm>
|
|
#include <cstdint>
|
|
#include <iostream>
|
|
#include <istream>
|
|
#include <ostream>
|
|
#include <tuple>
|
|
#include <vector>
|
|
|
|
/*
|
|
|
|
dp[i][j]=字符串A前i个与字符串B前j个
|
|
5
|
|
1 4 2 5 -12
|
|
4
|
|
-12 1 2 4
|
|
|
|
*/
|
|
|
|
|
|
using ll = int64_t;
|
|
|
|
#define gdp(i,j,k)(std::get<k>(dp[i][j]))
|
|
|
|
int main(){
|
|
std::iostream::sync_with_stdio(false);
|
|
std::cin.tie(nullptr);
|
|
ll n,m;
|
|
std::cin>>n;
|
|
std::vector<ll> a(n+1);
|
|
for(ll i=1;i<=n;i++)std::cin>>a[i];
|
|
std::cin>>m;
|
|
std::vector<ll> b(m+1);
|
|
for(ll j=1;j<=m;j++)std::cin>>b[j];
|
|
std::vector<std::vector<std::tuple<ll,ll,ll>>>dp(n+1,std::vector<std::tuple<ll,ll,ll>>(m+1));
|
|
for(ll i=1;i<=n;i++){
|
|
for(ll j=1;j<=m;j++){
|
|
if(a[i]!=b[j]){
|
|
gdp(i, j, 0) = gdp(i-1,j,0);
|
|
gdp(i, j, 1)=i-1;
|
|
gdp(i, j, 2)=j;
|
|
}else{
|
|
ll maxprev=0;
|
|
for(ll k=1;k<j;k++){
|
|
if(b[k]<a[i]){
|
|
maxprev=std::max(maxprev,gdp(i-1,k,0));
|
|
gdp(i,j,1)=i-1;
|
|
gdp(i,j,2)=k;
|
|
}
|
|
}
|
|
gdp(i,j,0)=maxprev+1;
|
|
}
|
|
}
|
|
}
|
|
ll ans=0,maxi=0,maxj=0;
|
|
for(ll i=1;i<=n;i++){
|
|
for(ll j=1;j<=m;j++){
|
|
// printf("dp[%lld][%lld]=%lld\n",i,j,dp[i][j]);
|
|
if(ans<gdp(i,j,0)){
|
|
ans=gdp(i,j,0);
|
|
maxi=i;
|
|
maxj=j;
|
|
}
|
|
}
|
|
}
|
|
std::vector<ll> ans2;
|
|
ans2.reserve(n);
|
|
// printf("maxi=%lld,maxj=%lld\n",maxi,maxj);
|
|
while(maxi>0){
|
|
ans2.push_back(a[maxi]);
|
|
ll tmpi=maxi;
|
|
maxi=gdp(maxi,maxj,1);
|
|
maxj=gdp(tmpi,maxj,2);
|
|
}
|
|
std::cout<<ans<<"\n";
|
|
std::reverse(ans2.begin(),ans2.end());
|
|
for(auto i:ans2){
|
|
std::cout<<i<<" ";
|
|
}
|
|
std::cout<<std::endl;
|
|
_Exit(0);
|
|
} |