这个题考查dp,最长非递减序列。
dp[i]表示以a[i]为结尾的最长非递减序列。初始化dp[]为1,状态转移方程为dp[i]=max(1,dp[j]+1)(j<i&&a[j]<=a[i]&&a[j]!=0)
特别注意:没有出现在最喜爱的序列中的数,其优先级为0,在考虑最长非递减序列时,应直接忽略0。
AC代码:
#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
using namespace std;
map<int,int> mm;
int a[10005];
int dp[10005];
int main()
{
int n;
int m;
cin>>n;
cin>>m;
for(int i=0;i<m;i++)
{
int d;
cin>>d;
mm[d]=i+1;
}
int l;
cin>>l;
for(int i=0;i<l;i++)
{
cin>>a[i];
if(mm.find(a[i])==mm.end())
{
a[i]=0;
}
else
{
a[i]=mm[a[i]];
}
}
for(int i=0;i<l;i++)
{
dp[i]=1;
}
for(int i=1;i<l;i++)
{
for(int j=0;j<i;j++)
{
if(a[j]<=a[i]&&a[j]!=0)
{
dp[i]=max(dp[i],dp[j]+1);
}
}
}
int maxx=1;
for(int i=0;i<l;i++)
{
if(dp[i]>maxx)
{
maxx=dp[i];
}
}
cout<<maxx;
}