Classical dynamic programming:find the longest increasing subsequence.
// 1045. Favorite Color Stripe.cpp: 主项目文件。 #include "stdafx.h" #include <cstdio> #include <cstring> #define max(a,b) a>b?a:b; const int N=203; int hash[N]; const int arrMax=10003; int arr[arrMax]; int cnt; int dp[arrMax]; int longestIncreasingSubsequence(){ for(int i=1;i<cnt;i++) dp[i]=1; for(int i=1;i<cnt;i++){ for(int j=1;j<i;j++){ if(arr[j]<=arr[i]) dp[i]=max(dp[i],dp[j]+1); } } int max=-1; for(int i=1;i<cnt;i++){ if(dp[i]>max) max=dp[i]; } return max; } int main() { int colorNum,favorateColorNum; scanf("%d%d",&colorNum,&favorateColorNum); memset(hash,0,sizeof(hash)); for(int i=0;i<favorateColorNum;i++){ int temp; scanf("%d",&temp); hash[temp]=i+1; } int seqNum; scanf("%d",&seqNum); cnt=1; for(int i=0;i<seqNum;i++){ int temp; scanf("%d",&temp); if(hash[temp]!=0) arr[cnt++]=hash[temp]; } int res=longestIncreasingSubsequence(); printf("%d\n",res); return 0; }