1 条题解
-
0
// 线性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
信息
- ID
- 2024
- 时间
- 2000ms
- 内存
- 2048MiB
- 难度
- 8
- 标签
- 递交数
- 180
- 已通过
- 33
- 上传者