n^2 的:
初始化 dp 数组为 1
dp[ i ] 表示 以 i 结尾的 LIS 的长度
for ( int i=0 ; i<n ; i++ )
{
for( int j = 0 ; j<i ;j++)
{
if(a[ i ] > a [ j ]&&dp[ i ]< dp[ j ]+1)
dp[ i ]= dp[ j ]+ 1;
}
}
int maxn =-1;
for( int i =0 ; i<n ; i++)
{
maxn=max( maxn, dp[ i ]);
}
nlogn 的:
如果 a[ i ] 大于 最后一个数, 就接到后面
否则 二分 找到对应的位置 替换掉
初始化 dp 数组为 1
dp[ i ] 表示 以 i 结尾的 LIS 的长度
for ( int i=0 ; i<n ; i++ )
{
for( int j = 0 ; j<i ;j++)
{
if(a[ i ] > a [ j ]&&dp[ i ]< dp[ j ]+1)
dp[ i ]= dp[ j ]+ 1;
}
}
int maxn =-1;
for( int i =0 ; i<n ; i++)
{
maxn=max( maxn, dp[ i ]);
}
nlogn 的:
如果 a[ i ] 大于 最后一个数, 就接到后面
否则 二分 找到对应的位置 替换掉
int cnt=0;
memset(LIS,-1,sizeof(LIS));
LIS[0]=c[0].r;
for(int i=1;i<n;i++)
{
if(c.r>LIS[cnt])
{
cnt++;
LIS[cnt]=c.r;
}
else
{
*lower_bound(LIS,LIS+cnt+1,c.r)=c.r;
}
}