2 条题解
-
0
#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
#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
- 上传者