zoukankan      html  css  js  c++  java
  • 求出所有LIS的可行起点

    在做到codeforces1488E Palindromic Doubles 的时候,需要求出一段序列所有LIS的可行起点,没学过相关的做法,自己想了一个。
    假设我们已知一个lis数组,其中lis[i]代表以a[i]结尾的最长LIS,vis[i]=true代表a[i]可以是某条LIS的其中一点,Max[i]代表lis值等于i时的最大值。
    则对于a[i],当 j>i && lis[j]=lis[i]+1 && Max[lis[j]]>a[i] 时,vis[i]=true;
    这样将数组从后往前枚举,同时维护vis,Max,最后求出的vis数组中,如果vis[i]true && lis[i]1 ,它就是可行的LIS起点。
    维护代码如下:

    for(int i=cnt;i>=1;--i)
    	{
    		if(LIS[i]==ans)
    		{
    			Max[LIS[i]]=max(Max[LIS[i]],b[i]);
    			vis[i]=1;
    			continue;
    		}
    		if(b[i]<Max[LIS[i]+1]) 
    		{
    			Max[LIS[i]]=max(Max[LIS[i]],b[i]);
    			vis[i]=1;
    		}
    	}
    

    对于求lis数组,只要在二分查找求LIS的代码上改一点点就好了:

    for(int i=1;i<=cnt;++i)
    {
    	if(b[i]>dp[ans]) dp[++ans]=b[i],LIS[i]=ans;
    	else
    	{
    		int x=upper_bound(dp+1,dp+1+ans,b[i])-dp;
    		dp[x]=b[i];
    		LIS[i]=x;
    	}
    }
    
  • 相关阅读:
    Servlet
    反射
    Python之装饰器
    app——升级测试点
    Python之基本运算符
    HTTP常见的几种认证机制
    Shell文件包含
    Shell输入/输出重定向
    Shell函数
    Shell循环语句
  • 原文地址:https://www.cnblogs.com/Tiork/p/14531874.html
Copyright © 2011-2022 走看看