将Eva喜欢的颜色按顺序编个优先级,

2 3 1 5 6-> 1 2 3 4 5

然后读取stripe,将Eva不喜欢的先剔除掉,剩下的颜色替换为相应的优先级

2 2 4(去掉) 1 5 5 6 3 1 1 5 6 就变为:

1 1 3 4 4 5 2 3 3 4 5

接下来就是求最长上升子序列LIS的问题了,搞定~

O(n^2)的算法:

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>

using namespace std;
const int maxn=10000+5;
int n,m;
int level[205];
int vis[205];
int a[maxn];
int main()
{
    scanf("%d",&n);
    scanf("%d",&m);
    memset(vis,0,sizeof(vis));
    int tmp;
    for(int i=1;i<=m;i++){
        scanf("%d",&tmp);
        level[tmp]=i;
        vis[tmp]=1;
    }
    int cnt=0;
    int L;
    scanf("%d",&L);
    for(int i=0;i<L;i++){
        scanf("%d",&tmp);
        if(vis[tmp]){
            a[cnt++]=level[tmp];
        }
    }
    //LIS最长上升子序列O(N^2)算法
    int dp[maxn]; //dp[i]表示以a[i]结尾的最长上升子序列的长度
    memset(dp,0,sizeof(dp));
    int ans=0;
    for(int i=0;i<cnt;i++){
        dp[i]=1;
        for(int j=0;j<=i-1;j++){
            if(a[j]<=a[i] && dp[j]+1>dp[i]){
                dp[i]=dp[j]+1;
            }
        }
        if(dp[i]>ans)
            ans=dp[i];
    }
    printf("%d\n",ans);
    return 0;
}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-21
  • 2021-07-30
  • 2021-07-25
  • 2021-05-19
  • 2021-07-22
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-25
  • 2022-12-23
  • 2022-12-23
  • 2021-10-04
相关资源
相似解决方案