原题链接:A1045 Favorite Color Stripe
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const int MAX = 10010;
int N, M, L;
int Fav[220] = {0}, Stripe[MAX];//Fav存储每个喜欢颜色的序列,0表示不喜欢
int DP[MAX] = {0}, maxinum = 0;//DP【i】表示每个以第i个颜色作为最后一个的最大长度
int main()
{
scanf("%d %d", &N, &M);
for(int i=1, color; i<=M; i++)
{
scanf("%d", &color);
Fav[color] = i;//存入喜欢的序列,注意从1开始,0表示不喜欢
}
scanf("%d", &L);
for(int i=0, j; i<L; i++)
{
scanf("%d", &Stripe[i]);
if(!Fav[Stripe[i]]) continue;//不是喜欢的颜色,直接进入下一个
DP[i] = 1;
for(j=0; j<i; j++)
{
if(Fav[Stripe[j]] && Fav[Stripe[j]] <= Fav[Stripe[i]] && DP[j]+1 > DP[i])//注意此时仍要判断第j个颜色是否喜欢
{
DP[i] = DP[j]+1;
}
}
maxinum = max(maxinum, DP[i]);//取最大值
}
printf("%d", maxinum);
return 0;
}
’
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const int MAX = 10010;
int N, M, L;
int Fav[220] = {0}, Stripe[MAX];
int DP[220][MAX] = {{0}};//DP[i][j]表示Fav中的第i个和Stripe中的第j个之前最大匹配的个数
int main()
{
scanf("%d %d", &N, &M);
for(int i=1; i<=M; i++) scanf("%d", &Fav[i]);
scanf("%d", &L);
for(int i=1; i<=L; i++) scanf("%d", &Stripe[i]);
for(int i=1, j; i<=M; i++)
{
for(j=1; j<=L; j++)
{
if(Fav[i] == Stripe[j])//若此时相等则匹配个数等于之前匹配的个数+1
{
DP[i][j] = max(DP[i-1][j], DP[i][j-1]) + 1;
}
else DP[i][j] = max(DP[i-1][j], DP[i][j-1]);//否则和之前最大匹配相同
}
}
printf("%d", DP[M][L]);
return 0;
}