【PAT甲级真题】- Favorite Color Stripe (30)

题目来源

Favorite Color Stripe (30)

注意点

  • 颜色序列不用每个都出现,只要按顺序即可

题目描述

Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting off those unwanted pieces and sewing the remaining parts together to form her favorite color stripe.

It is said that a normal human eye can distinguish about less than 200 different colors, so Eva's favorite colors are limited. However the original stripe could be very long, and Eva would like to have the remaining favorite stripe with the maximum length. So she needs your help to find her the best result.

Note that the solution might not be unique, but you only have to tell her the maximum length. For example, given a stripe of colors {2 2 4 1 5 5 6 3 1 1 5 6}. If Eva's favorite colors are given in her favorite order as {2 3 1 5 6}, then she has 4 possible best solutions {2 2 1 1 1 5 6}, {2 2 1 5 5 5 6}, {2 2 1 5 5 6 6}, and {2 2 3 1 1 5 6}.

输入描述:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=200) which is the total number of colors involved (and hence the colors are numbered from 1 to N). Then the next line starts with a positive integer M (<=200) followed by M Eva's favorite color numbers given in her favorite order. Finally the third line starts with a positive integer L (<=10000) which is the length of the given stripe, followed by L colors on the stripe. All the numbers in a line are separated by a space.

输出描述:

For each test case, simply print in a line the maximum length of Eva's favorite stripe.

输入例子:

复制代码
6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6

输出例子:

复制代码
7

思路简介

其实就是一道最长不降序列

把颜色的色号映射为输入的顺序

然后问题即转化为第二行的最长不降序列

注意题目当中的要求的颜色序列不用每个颜色都出现,只要按照顺序出现即可,可以跳过某个颜色

遇到的问题

  1. 以为所有颜色必须出现

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

void solve(){
    int n;cin>>n;
    int m;cin>>m;
    vector<int>fav_index(n+1,0);// 颜色 -> 排名,不在喜欢列表中的颜色排名为0
    for(int i=1;i<=m;++i){
        int fav;
        cin>>fav;
        fav_index[fav]=i;
    }

    int l;cin>>l;
    vector<int>stripe;
    for(int i=0;i<l;++i){
        int color;
        cin>>color;
        if(!fav_index[color])continue;
        stripe.emplace_back(fav_index[color]);
    }


    int len=stripe.size();
    vector<int> dp(len,1);//dp(i)以i结尾的最长不降序列
    int ans=1;
    for(int i=0;i<len;++i){
        for(int j=0;j<i;++j){
            if(stripe[i]>=stripe[j]){
                dp[i]=max(dp[i],dp[j]+1);
            }
        }   
        ans=max(ans,dp[i]);
    }
    cout<<ans<<'\n';
}

int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);
    //fstream in("in.txt",ios::in);cin.rdbuf(in.rdbuf());

    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
相关推荐
王维同学2 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
战族狼魂3 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
李剑一3 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH3 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
中达瑞和-高光谱·多光谱3 小时前
1nm到8nm光谱分辨率,你的应用该选哪款光谱相机?
算法·高光谱·高光谱相机
脱胎换骨-军哥3 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
ChaoZiLL4 小时前
我的数据结构4-栈和队列
数据结构
香辣牛肉饭4 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
miller-tsunami4 小时前
顺序表相关知识点
数据结构·顺序表