题目链接 Favorite Color Stripe
题意:给定A序列和B序列,你需要在B序列中找出任意一个最长的子序列,使得这个子序列也是A的子序列
(这个子序列的相邻元素可以重复)
只要求出这个子序列长度的最大值即可
很基础的DP题,设f[i]为当前以a[i]结尾的子序列的长度的最大值,扫描B序列的每个元素时实时更新即可。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int L = 10010; const int N = 210; int a[L], c[N], f[N]; vector <int> v[N]; int n, m, l; int ans; int main(){ scanf("%d%d", &n, &m); rep(i, 1, m){ scanf("%d", c + i); v[c[i]].push_back(i); } scanf("%d", &l); rep(i, 1, l) scanf("%d", a + i); rep(i, 1, l){ for (auto u : v[a[i]]){ if (f[u]) ++f[u]; rep(j, 0, u - 1) f[u] = max(f[u], f[j] + 1); } } rep(i, 1, m) ans = max(ans, f[i]); return 0 * printf("%d\n", ans); }
时间: 2024-10-15 12:41:38