zoukankan      html  css  js  c++  java
  • 洛谷 P1439 【模板】最长公共子序列(LCS、LIS)

    传送门


    解题思路

    个人认为这根本不是模板,而这题更倾向于LCS在某种特殊情况下的一种优化时间的方法。

    真正的模板:LCS模板

    这道题就是在两个字符串都是1~n的全排列时可以把时间复杂度从n2优化到nlogn。

    把s2中的每一个元素在s1中的位置用一个数组记录下来,然后对这个数组做一遍最长上升子序列(LIS),求得的答案也就是LCS的答案。

    求LIS的时间复杂度是O(nlogn)(优化版的LIS),不会的请看模板:LIS模板

    AC代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxn=100005;
     6 int n,a[maxn],b[maxn],weizhi[maxn],c[maxn],dp[maxn],cnt;
     7 int main()
     8 {
     9     cin>>n;
    10     for(int i=1;i<=n;i++){
    11         scanf("%d",&a[i]);
    12         weizhi[a[i]]=i;
    13     }
    14     for(int i=1;i<=n;i++){
    15         scanf("%d",&b[i]);
    16         c[i]=weizhi[b[i]];
    17     } 
    18     for(int i=1;i<=n;i++){
    19         if(c[i]>dp[cnt]) dp[++cnt]=c[i];
    20         else dp[lower_bound(dp+1,dp+cnt+1,c[i])-dp]=c[i];
    21     }
    22     cout<<cnt;
    23     return 0;
    24 }
  • 相关阅读:
    Epoll技术深入学习
    nginx
    epoll案例
    Linux网络编程初步
    链表快速排序(已通过ACM在线评测)
    C++内存管理
    c++11并发语法初步
    数据库与SQL优化笔记(一)
    C++面向对象模型(虚表与虚表指针)
    c++的一些杂项
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/12142849.html
Copyright © 2011-2022 走看看