LCIS
今天做到了一道 LCIS 的裸题,便写了篇 blog 来记录一下。
给出两个长度分别为
n
,
先枚举
A
序列的位置
在枚举的时候,如果出现了
Ai
=
Bj
的情况,那么就应在
1
到
Code
#define fo(i,j,l) for(int i=j;i<=l;i++)
fo(i,1,n)
{
int k=0;
fo(j,1,m)
if(a[i]==b[j])
{
if(f[k]+1>f[j])//如果a[i]=b[j],就在1到j-1之间,找一个b[k]小于b[j](a[i])的最大的f[k]来转移到f[j]
f[j]=f[k]+1;
}else
if(a[i]>b[j])
if(f[j]>f[k])k=j;//顺带维护1到j-1中,小于a[i]的b[k]的f[k]的最大值
}
int k=0;
fo(i,1,m)if(f[i]>f[k])k=i;
如果要记录方案,可以加一个链表来维护方案。
Code2.0
#define fo(i,j,l) for(int i=j;i<=l;i++)
fo(i,1,n)
{
int k=0,y=0;
fo(j,1,m)
if(a[i]==b[j])
{
if(f[k]+1>f[j])
f[j]=f[k]+1,z[j]=++o,ne[o]=y,lb[o]=j;
}else
if(a[i]>b[j])
if(f[j]>f[k])k=j,y=z[k];
}
int k=0;
fo(i,1,m)if(f[i]>f[k])k=i;
int r=0,a=z[k];
printf("%d\n",f[k]);
while(a)d[++r]=lb[a],a=ne[a];
fd(i,r,1)printf("%d ",b[d[i]]);