2 条题解

  • 0
    @ 2026-7-20 1:42:32

    B3637 最长上升子序列——题解

    解题思路

    f[i] 表示以第 ii 个数结尾的最长上升子序列长度。枚举所有更早位置 j<ij<i,若 a[j]<a[i],就可以把第 ii 个数接在以 jj 结尾的序列后面,更新 f[i]=max(f[i],f[j]+1)

    复杂度分析

    时间复杂度 O(n2)O(n^2),空间复杂度 O(n)O(n)

    C++17 参考代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[5005],f[5005];
    int main(){
        ios::sync_with_stdio(false);cin.tie(nullptr);
        int n;cin>>n;int ans=0;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++){f[i]=1;for(int j=1;j<i;j++)if(a[j]<a[i])f[i]=max(f[i],f[j]+1);ans=max(ans,f[i]);}
        cout<<ans<<'\n';return 0;
    }
    
    • 0
      @ 2026-7-20 1:42:32

      #include <bits/stdc++.h> using namespace std; int a[5005],f[5005]; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int n;cin>>n;int ans=0; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++){f[i]=1;for(int j=1;j<i;j++)if(a[j]<a[i])f[i]=max(f[i],f[j]+1);ans=max(ans,f[i]);} cout<<ans<<'\n';return 0; }

      • 1

      信息

      ID
      4911
      时间
      5000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      2
      已通过
      2
      上传者