輸入:
1
5 1 4 2 5 -12
4 -12 1 2 4
輸出:
2
題意: 有兩個數組, N, M <= 500. 問最長上升公共子序列(LICS)
思路: 最長上升公共子序列(LICS)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
//LCIS (最長上升公共子序列)
const int V = 500 + 5;
const int MaxN = 500 + 5;
int dp[V][V]; // dp[i][j] 表示 第一串前i個, 第二串前j個 並且以b[j]結尾 的最大公共子序列
int a[MaxN], b[MaxN], n, m, t, ans;
int main() {
int i, j;
cin >> t;
while(t--){
memset(dp, 0, sizeof(dp));
ans = 0;
cin >> n;
for(i = 0; i < n; ++i)
cin >> a[i];
cin >> m;
for(i = 0; i < m; ++i)
cin >> b[i];
for(i = 0; i < n; ++i) {
int Max = 0;
for(j = 0; j < m; ++j) {
dp[i + 1][j + 1] = dp[i][j + 1];
if(a[i] > b[j]) //記錄上一狀態LCIS。
Max = max(Max, dp[i][j + 1]);
if(a[i] == b[j])
dp[i + 1][j + 1] = Max + 1;
}
}
for(j = 1; j <= m; ++j)
ans = max(ans, dp[n][j]);
cout << ans << endl;
}
}