题解:P10954 LCIS
light_searcher · · 题解
首先,肯定是 dp。
设
为什么设一个这么奇怪的状态呢?我们可以想想其他状态。如果是以
接下来进入正题,考虑如何转移。
分类讨论:
最后答案是
那么已经有了一个
Code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e3+5;
int n,a[N],b[N],f[N][N],ans;
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&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(b[k]<b[j]) mx=max(mx,f[i-1][k]);
f[i][j]=mx+1;
}
ans=max(ans,f[i][j]);
}
printf("%lld",ans);
return 0;
}
结果这么写常数很小,直接跑过了。
但是还是考虑继续优化。发现当
Code:
#include<bits/stdc++.h>
using namespace std;
const int N=3e3+5;
int n,a[N],b[N],f[N][N],ans;
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 val=0;
for(int j=1;j<=n;j++){
if(a[i]!=b[j]) f[i][j]=f[i-1][j];
else f[i][j]=val+1;
if(b[j]<a[i]) val=max(val,f[i-1][j]);
ans=max(ans,f[i][j]);
}
}
printf("%d",ans);
return 0;
}