最长上升子序列问题(LIS,Longest Increasing Subsequence)
BUG测试用例65 2 3 1 5 61 4
#include<stdio.h>
#define MAX 205
int like[MAX];
int strip[10005];
int fav[10005];
int order[MAX];
int main(){
int N,M,L,max,res=0;
memset(order,1,sizeof(order));
scanf("%d",&N);
scanf("%d",&M);
for(int i=0;i<M;i++){
scanf("%d",&like[i]);
order[like[i]]=i;
}
scanf("%d",&L);
for(int i=0;i<L;i++)
scanf("%d",&strip[i]);
for(int i=0;i<L;i++){
max=0;
for(int j=0;j<i;j++){
if(order[strip[j]]<=order[strip[i]]&&order[strip[i]]<M){
max=max<fav[j]?fav[j]:max;
}
}
fav[i]=max+1;
res=res>fav[i]?res:fav[i];
}
printf("%d",res);
return 0;
}
稍加改动即可:
#include<stdio.h>
#define MAX 205
int like[MAX];
int strip[10005];
int fav[10005];
int order[MAX];
int main(){
int N,M,L,max,res=0;
memset(order,1,sizeof(order));
scanf("%d",&N);
scanf("%d",&M);
for(int i=0;i<M;i++){
scanf("%d",&like[i]);
order[like[i]]=i;
}
scanf("%d",&L);
for(int i=0;i<L;i++)
scanf("%d",&strip[i]);
for(int i=0;i<L;i++){
if(order[strip[i]]>=M)
continue;
max=0;
for(int j=0;j<i;j++){
if(order[strip[j]]<=order[strip[i]]){
max=max<fav[j]?fav[j]:max;
}
}
fav[i]=max+1;
res=res>fav[i]?res:fav[i];
}
printf("%d",res);
return 0;
}