1 solutions

  • -2
    @ 2024-7-4 9:11:15
    #include<bits/stdc++.h>
    using namespace std;
    const int N=3010;
    int f[N][N];
    /*
    f[i][j] 表示a的前i个序列和b的前j个序列 构成的以b[j]结尾的最长上升子序列的最大值
    */
    int a[N],b[N];
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(int j=1;j<=n;j++)
        {
            cin>>b[j];
        }
        for(int i=1;i<=n;i++) //枚举第一个序列
        {
            for(int j=1;j<=n;j++) //枚举第二个序列
            {
                f[i][j]=f[i-1][j]; //不选a的第i个字符
                if(a[i]==b[j]) //可以选
                {
                    int maxv=1;
                    for(int k=1;k<j;k++) //最长上升子系列
                    {
                        if(b[j]>b[k])
                        {
                            maxv=max(maxv,f[i-1][k]+1);
                        }   
                    }
                    f[i][j]=max(maxv,f[i][j]);
                } 
            }
         
        }
        int res=0;
        for(int i=1;i<=n;i++)
        {
            res=max(res,f[n][i]);
        }
        cout<<res;
        return 0;
    }
    
    • 1

    Information

    ID
    220
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    7
    Tags
    (None)
    # Submissions
    50
    Accepted
    6
    Uploaded By