题目描述
给定一个长度为 NN 数组 aa 和一个长度为 MM 的数组 bb。
请你求出它们的最长公共上升子序列长度为多少。
输入描述
输入第一行包含两个整数 N,MN,M,分别表示数组 aa 和 bb 的长度。
第二行包含 NN 个整数 a1,a2,...,ana1,a2,...,an。
第三行包含 MM 个整数 b1,b2,...,bnb1,b2,...,bn。
1≤N,M≤1021≤N,M≤102,1≤ai,bi≤1091≤ai,bi≤109。
输出描述
输出一行整数表示答案。
输入输出样例
示例 1
输入
5 6
1 3 2 4 5
2 3 1 4 5 6
输出
3
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n), b(m);
// 读取数组a和b
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < m; ++i) cin >> b[i];
vector<int> dp(m, 0); // dp[j]表示以b[j]结尾的LCIS长度
int max_len = 0;
for (int num : a) { // 遍历数组a的每个元素
int current_max = 0; // 维护当前最大LCIS长度
for (int j = 0; j < m; ++j) { // 遍历数组b
if (num > b[j]) { // 当前元素更大→可以形成更长的序列
current_max = max(current_max, dp[j]);
} else if (num == b[j]) { // 发现公共元素
dp[j] = max(dp[j], current_max + 1);
max_len = max(max_len, dp[j]);
}
}
}
cout << max_len << endl;
return 0;
}