alg2025/src/8/27/opj2000.cpp
2025-08-27 16:51:18 +08:00

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);
}