1045 Favorite Color Stripe
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805437411475456
解题思路
题目意思是,给定颜色的出现顺序,再给一个长序列,求出符合顺序的最长序列。
1.最长递增子序列解法
1.用lev[i]记录第i种颜色的下标,即颜色的出现顺序;
2.遍历第二个序列,剔除未曾出现的颜色;
3.根据颜色的出现顺序求出其最长递增子序列;
代码展示
1.最长递增子序列
#include<bits/stdc++.h>
using namespace std;
/*
思路:
字符出现的顺序要一致
6
5 1 2 3 4 5
5 1 2 5 3 4
*/
int lev[205],L[10005];
int num[10005];
int main(){
int n,m,l;
cin>>n;
cin>>m;
for(int i=0;i<m;i++){
int x;
cin>>x;
lev[x]=i+1;
}
cin>>l;int k=0;
for(int i=0;i<l;i++){
int x;
cin>>x;
if(lev[x]>=1)L[k++]=x;
}
int ans=0;
for(int i=0;i<k;i++){
num[i]=1;
for(int j=0;j<i;j++){
if(lev[L[i]]>=lev[L[j]]&&num[i]<num[j]+1)
num[i]=num[j]+1;
ans=max(ans,num[i]);
}
}
cout<<ans<<endl;
return 0;
}
2.最长公共子序列解法
1.我原本的思路就是用公共序列,但不知道如何处理颜色重复出现的情况;随后看了别人的解法。
#include<bits/stdc++.h>
using namespace std;
/*
思路:
LCS
6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6
*/
int lev[205],L[10005];
int dp[10005][10005];
int main(){
int n,m,l;
cin>>n;
cin>>m;
for(int i=1;i<=m;i++){
int x;
cin>>x;
lev[i]=x;
}
cin>>l;
for(int i=1;i<=l;i++){
cin>>L[i];
}
for(int i=1;i<=m;i++){
for(int j=1;j<=l;j++){
int maxx=max(dp[i-1][j],dp[i][j-1]);
maxx=max(maxx,dp[i-1][j-1]);
if(lev[i]==L[j])
dp[i][j]=maxx+1;
else dp[i][j]=maxx;
}
}
cout<<dp[m][l]<<endl;
return 0;
}