2 条题解

  • 0
    @ 2025-10-8 16:56:44
    #include<bits/stdc++.h>//O(n²)得100分 
    using namespace std;
    typedef long long LL;
    const int N=3100;
    int f[N][N];//f[i][j]表示以b[j]为结尾(必含b[j])的最长公共上升子序列长度
    LL a[N],b[N];
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
        a[0]=b[0]=-(LL(1)<<60);
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
        {
            int val=0; 
            for(int j=1;j<=n;j++)
            {
                if(a[i]==b[j]) f[i][j]=val+1;
                else f[i][j]=f[i-1][j];
                if(b[j]<a[i])val=max(val,f[i-1][j]);
            }
        }
        int ans=0;for(int j=1;j<=n;j++)ans=max(ans,f[n][j]);
        printf("%d\n",ans);
        return 0;
    }
    
    #include<bits/stdc++.h>//O(n³)得90分 
    using namespace std;
    typedef long long LL;
    const int N=3100;
    int f[N][N];//f[i][j]表示以b[j]为结尾(必含b[j])的最长公共上升子序列长度 
    LL a[N],b[N];
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
        a[0]=b[0]=-(LL(1)<<60);
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                if(a[i]==b[j]) 
                {
                    for(int k=0;k<j;k++)if(b[k]<a[i])
                        f[i][j]=max(f[i][j],f[i-1][k]+1);
                }
                else f[i][j]=f[i-1][j];
            }
        int ans=0;for(int j=1;j<=n;j++)ans=max(ans,f[n][j]);
        printf("%d\n",ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:56:26
      #include<bits/stdc++.h>//O(n^2)得100分 
      using namespace std;
      typedef long long LL;
      const int N=3100;
      int f[N][N];//f[i][j]表示以b[j]为结尾(必含b[j])的最长公共上升子序列长度
      LL a[N],b[N];
      int main()
      {
      	int n;scanf("%d",&n);
      	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
      	for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
      	a[0]=b[0]=-(LL(1)<<60);
      	memset(f,0,sizeof(f));
      	for(int i=1;i<=n;i++)
      	{
      		int val=0; 
      		for(int j=1;j<=n;j++)
      		{
      			if(a[i]==b[j]) f[i][j]=val+1;
      			else f[i][j]=f[i-1][j];
      			if(b[j]<a[i])val=max(val,f[i-1][j]);
      		}
      	}
      	int ans=0;for(int j=1;j<=n;j++)ans=max(ans,f[n][j]);
      	printf("%d\n",ans);
      	return 0;
      }
      
      /*
      #include<bits/stdc++.h>//O(n^3)得90分 
      using namespace std;
      typedef long long LL;
      const int N=3100;
      int f[N][N];//f[i][j]表示以b[j]为结尾(必含b[j])的最长公共上升子序列长度 
      LL a[N],b[N];
      int main()
      {
      	int n;scanf("%d",&n);
      	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
      	for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
      	a[0]=b[0]=-(LL(1)<<60);
      	memset(f,0,sizeof(f));
      	for(int i=1;i<=n;i++)
      		for(int j=1;j<=n;j++)
      		{
      			if(a[i]==b[j]) 
      			{
      				for(int k=0;k<j;k++)if(b[k]<a[i])
      					f[i][j]=max(f[i][j],f[i-1][k]+1);
      			}
      			else f[i][j]=f[i-1][j];
      		}
      	int ans=0;for(int j=1;j<=n;j++)ans=max(ans,f[n][j]);
      	printf("%d\n",ans);
      	return 0;
      }
      */
      • 1

      *【动态规划:区间二维一边推】最长公共上升子序列

      信息

      ID
      1359
      时间
      250ms
      内存
      64MiB
      难度
      6
      标签
      递交数
      163
      已通过
      51
      上传者