有可能各位会像我一样没有寻找到最好的遍历顺序,代码写成了以ai为结尾,与b进行匹配的这种思路(就是和其他解的i和j的含义弄反了)
在a[i]==b[j]时的代码是
if(a[i]==b[j]){
for(int k=1;k<i;k++)
if(a[k]<a[i])
f[i][j]=max(f[i][j],f[k][j-1]+1);
}
同样也可以进行优化,
优化思路是差不多的,只不过需要把其他题解的val或者maxv换成一个数组
虽然f[k][j-1]的k和j都是不断变化的,无法像其他思路那样用一个定值去
约束,但我们可以用一个数组去记录。当a[i]<b[j]时,进行更改val数组。
代码如下:
#include <iostream>
using namespace std;
const int maxn=3030;
int f[maxn][maxn];
int a[maxn];
int b[maxn];
int n;
int val[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i]==b[j]){
//for(int k=1;k<i;k++)
//if(a[k]<a[i])
//f[i][j]=max(f[i][j],f[k][j-1]+1);
f[i][j]=val[j]+1;
}else{
f[i][j]=f[i][j-1];
}
if(a[i]<b[j]) val[j]=max(val[j],f[i][j-1]);
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,f[i][n]);
cout<<ans<<endl;
}