很多用动态规划的
但是没学过估计看起来会很迷
找到了一个大佬写的没用动规的
也理解了好久o(╥﹏╥)o
引用代码↓
#include<stdio.h>
#include<string.h>
using namespace std;
int stripe[10002];//存放彩带
int like[202];//存放喜欢序列
int main(){
int n;
scanf("%d", &n);
int n_like;//喜欢的颜色序列个数
memset(like, 0, sizeof(like));
memset(stripe, 0, sizeof(stripe));//init
scanf("%d", &n_like);
for (int i = 1; i <= n_like; i++){
int tmp;
scanf("%d", &tmp);
like[tmp] = i;//喜欢颜色序列做一个映射
}
int num;
scanf("%d", &num);
for (int i = 1; i <= num; i++){
int tmp;
scanf("%d", &tmp);
stripe[i] = like[tmp];//变成映射后的彩带序列
}
int max;
int big[1002];
memset(big, 0, sizeof(big));
for (int i = 1; i <= num; i++){
if (stripe[i] == 0)continue;//表示当前颜色不在喜欢的颜色序列中
max = 0;
for (int j = 1; j <= stripe[i]; j++){
//printf("big[j] %d j %d \n",big[j],j);
if (max <= big[j]){ //找到当前颜色之前累计数量最多的颜色
//就是把对于当前点来说,前面的那些点里
//符合喜欢顺序的,存下来
max = big[j];
}
}
big[stripe[i]] = max + 1; //把当前颜色添加到最多的颜色之后
//形成最长序列
//printf("max %d i %d stripe[i] %d \n",max, i, stripe[i]);
/*for(int k=0; k<=num ; k++){ //用这个观察更新的规律
printf("big %d k %d \n",big[k],k);
}
printf("\n");*/
}
max = 0;
for (int i = n_like; i >= 1; i--){
if (big[i] > max)max = big[i];
}
printf("%d\n", max);
return 0;
}
不容易啊,,,