1 条题解

  • 0
    @ 2025-12-1 21:16:32
    // 线性DP O(n^3)
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=10005;
    int n,a[N],b[N],ans;
    int f[N][N]; //f[i,j]表示前(i,j)个数且以 b[j] 为结尾的最长公共上升子序列的长度
    
    int main(){
      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]);
      
      for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
          if(a[i]!=b[j]) f[i][j]=f[i-1][j];
          else{
            int mx=0;
            for(int k=1;k<j;k++) if(a[i]>b[k])mx=max(mx,f[i-1][k]);
            f[i][j]=mx+1;
          }
          ans=max(ans,f[i][j]);
        }
      }
      printf("%d",ans);
    }
    
    
    // 线性DP O(n^2)
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=10005;
    int n,a[N],b[N],ans;
    int f[N][N]; //f[i,j]表示前(i,j)个数且以 b[j] 为结尾的最长公共上升子序列的长度
    
    int main(){
      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]);
      
      for(int i=1;i<=n;i++){
        int mx=0;
        for(int j=1;j<=n;j++){
          if(a[i]!=b[j]) f[i][j]=f[i-1][j];
          else f[i][j]=mx+1; //用 1~[i-1,j-1] 的LCIS接上a[i]
          if(a[i]>b[j]) mx=max(mx,f[i-1][j]); //保存 1~[i-1,j] 以a[i]结尾的LCIS的长度
          ans=max(ans,f[i][j]);
        }
      }
      printf("%d",ans);
    }
    
    • 1

    E5_3 最长公共上升子序列LCIS1️⃣

    信息

    ID
    2024
    时间
    2000ms
    内存
    2048MiB
    难度
    8
    标签
    递交数
    180
    已通过
    33
    上传者