#include<bits/stdc++.h>
using namespace std;#definedbdouble#definelllonglong#definePirpair<int,int>#definefifirst#definesesecond#definepbpush_back#definem_pmake_pair#defineinf0x3f3f3f3f#defineINF0x3f3f3f3f3f3f3f3f/*==========ACMer===========*/constint N =3005;int n, dp[N][N];int a[N], b[N];intmain(){scanf("%d",&n);for(int i =1; i <= n; i ++)scanf("%d",&a[i]);for(int i =1; i <= n; i ++)scanf("%d",&b[i]);int ans =0;for(int i =1; i <= n; i ++){int mx =0;for(int j =1; j <= n; j ++){
dp[i][j]= dp[i -1][j];if(a[i]== b[j]) dp[i][j]=max(dp[i][j], mx +1);if(b[j]< a[i]) mx =max(mx, dp[i -1][j]);}}for(int i =1; i <= n; i ++){
ans =max(ans, dp[n][i]);}printf("%d\n", ans);return0;}
思路这题是在求最长公共子序列的基础上求要求递增。我们可以简单的三层 for 循环进行枚举 ,但是我们的第三层 for 循环是在第二层 for 循环的时候用一个 mx 变量进行,不断维护的。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define .