有两个模板:
最长上升子序列这类题目都是这俩变形而来
最长上升子序列模型
AcWing 1017. 怪盗基德的滑翔翼1120人打卡
AcWing 1014. 登山1094人打卡
AcWing 482. 合唱队形1069人打卡
AcWing 1012. 友好城市1040人打卡
AcWing 1016. 最大上升子序列和1048人打卡
AcWing 1010. 拦截导弹944人打卡
AcWing 187. 导弹防御系统758人打卡
AcWing 272. 最长公共上升子序列764人打卡
最长上升子序列:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1005;
int dp[maxn],a[maxn];
int main()
{int n;cin>>n;int mx=0;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++){dp[i]=1;for(int j=1;j<i;j++){if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);}mx=max(mx,dp[i]);}cout<<mx;
}
最长公共子序列
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1005;
char a[maxn], b[maxn];
int dp[maxn][maxn];
int main()
{int n,m;cin>>n>>m;cin>>a+1>>b+1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i]==b[j])dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}cout<<dp[n][m];
}