输入:
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; } }

本文介绍了一种求解最长上升公共子序列(LICS)问题的算法实现,通过动态规划方法,有效地解决了两个序列间最长上升公共子序列的寻找问题。
389

被折叠的 条评论
为什么被折叠?



