1045 Favorite Color Stripe(LIS解法)
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1045 Favorite Color Stripe(LIS解法)相关的知识,希望对你有一定的参考价值。
解题思路
本题属于Longest Increasing Sequence最长不下降子序列,但是要注意,LIS当中不会有无效的元素,而本题是有的,所以先要把无效元素过滤掉,才能转化成为LIS问题。
这里用到了hashTable(用map更慢),初始化全零。有两个用处:1.将元素设置成伊娃规定的的顺序,然后映射到顺序上,不再对原数组进行排序(因为反正是计数,不需要保留原数据) 2.是过滤掉不是伊娃想要的元素。
有一个特别易错的点,我认为递归边界是dp[0] = 1,但是这不严谨,因为在过滤一遍之后,每个元素都能自成一个子序列,所以应当是dp[i] = 1。
彩蛋·珍藏版原创测试用例
4
3 1 2 3
10 4 2 4 1 1 2 1 1 1 4
AC代码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int INF = 1000000000;//10的9次方
const int maxn = 10010;
const double eps = 1e-3;
int type,colorN,EvaN;//感觉type是无用的
int hashTable[210] = {0};
int b[maxn];
int dp[maxn] = {0};
int main(){
scanf("%d",&type);
scanf("%d",&EvaN);
for(int i=1;i<=EvaN;i++){
int color;
scanf("%d",&color);
hashTable[color] = i;
}
int num = 0;
scanf("%d",&colorN);
for(int i=0;i<colorN;i++){
int color;
scanf("%d",&color);
if(hashTable[color]>0)b[num++] = hashTable[color];
}
int ans = 0;
for(int i=0;i<num;i++){
dp[i] = 1;
//每一轮更新一个元素的dp
for(int j=0;j<i;j++){
if(dp[j]+1>dp[i]&&b[j]<=b[i])dp[i] = dp[j] + 1;
}
//每一轮结束更新ans
ans = max(ans,dp[i]);
}
printf("%d\\n",ans);
return 0;
}
以上是关于1045 Favorite Color Stripe(LIS解法)的主要内容,如果未能解决你的问题,请参考以下文章
PAT 1045. Favorite Color Stripe
PAT 1045. Favorite Color Stripe (30)
1045. Favorite Color Stripe (30)-PAT甲级真题
1045 Favorite Color Stripe (最长不下降子序列 LIS)