LIS与LCS的nlogn解法
LIS(nlogn)
#include<iostream> #include<cstdio> using namespace std; const int maxn=1e5+5; int a[maxn]; int n; int lis[maxn]; int len=1; int find(int x){ int l=1,r=len,m; while(l<r){ m=l+(r-l)/2; if(lis[m]>=a[x]){//这里若去掉等号即为 非严格递增序列 r=m; } else{ l=m+1; } } return l; } int main(void){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); lis[1]=a[1]; for(int i=2;i<=n;i++){ if(a[i]>lis[len]){ lis[++len]=a[i]; } else{ int pos=find(i); lis[pos]=a[i]; } } printf("%d",len); return 0; }
LCS(nlogn)
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; const int maxn=1e6+5; int n,len=0; int lis[maxn]; int a[maxn]; int b[maxn]; int loc[maxn]; int find(int x){ int l=1,r=len,m; while(l<r){ m=l+(r-l)/2; //if(lis[m]>=b[x]){//智障错误,找了那么久。。 if(lis[m]>=x){ r=m; } else l=m+1; } return l; } int main(void){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++){ scanf("%d",&b[i]); loc[b[i]]=i; } for(int i=1;i<=n;i++){ b[i]=loc[a[i]]; } // for(int i=1;i<=n;i++)printf("%d",b[i]) ;// // printf("\n"); if(n!=0)lis[++len]=b[1]; for(int i=2;i<=n;i++){ if(b[i]>lis[len]){ lis[++len]=b[i]; } else{ int pos=find(b[i]); lis[pos]=b[i]; } } printf("%d",len); return 0; }
博文系博主原创,转载请注明出处 o(* ̄▽ ̄*)ブ 更多博文源自https://www.cnblogs.com/yzm10
分类:
1-8-动态规划-其他DP
, 7-7-算法-字符串
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】