VIJOS P1264 神秘的咒语
来源:互联网 发布:吾爱破解 知乎 编辑:程序博客网 时间:2024/05/02 23:21
输入:
15 1 4 2 5 -124 -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; }}