PAT 甲级 1045 Favorite Color Stripe(DP)
题目链接 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);
}

浙公网安备 33010602011771号