1.最长公共子序列
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m, l;
cin >> n >> m;
int a[m];
for(int i=1; i<=m; i++) {
cin >> a[i];
}
cin >> l;
int b[l+1], dp[m+1][l+1];
for(int i=1; i<=l; i++) {
cin >> b[i];
}
memset(dp, 0, sizeof(dp));
for(int i=1; i<=m; i++) {
for(int j=1; j<=l; j++) {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
if(a[i] == b[j]) { //字符相等
dp[i][j] += 1;
}
}
}
cout << dp[m][l] << endl;
return 0;
}
2.最长非下降
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m, l;
int tmp;
cin >> n >> m;
int a[m+1];
for(int i=1; i<=m; i++) {
cin >> tmp;
a[tmp] = i;
}
cin >> l;
int cnt= 0;
int b[l+1];
for(int i=1; i<=l; i++) {
cin >> tmp;
if(a[tmp]) {
b[cnt++] = a[tmp];
}
}
int dp[cnt];
int Max = 0;
for(int i=0; i<cnt; i++) {
dp[i] = 1;
for(int j=0; j<i; j++) {
if(b[i] >= b[j]) { //字符相等
dp[i] = max(dp[i], dp[j]+1);
}
}
Max = max(dp[i], Max);
}
cout << dp[cnt-1] << endl;
return 0;
}