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;    }}


原创粉丝点击