发现原先的三重循环中存在重复计算:计算f[i][j]时:计算f[i-1][1]~f[i-1][j-1]+1的最大值+1
计算f[i][j+1]时:计算f[i-1][1]-f[i-1][j]的最大值+1
用res存前缀和中的最大值
每次更新res,只要取前缀和和当前f[i-1][j]+1的最大值
`
include [HTML_REMOVED]
using namespace std;
const int N = 3001;
int f[N][N];
int a[N],b[N];
int main()
{
int n;
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++)
f[i][j] = 1;
for(int i=1;i<=n;i++)
{
int res = 1;
for(int j = 1;j<=n;j++)
{
f[i][j] = f[i-1][j];
if (a[i] == b[j]) f[i][j] = max(f[i][j],res);
if (a[i]>b[j]) res = max(res,f[i][j]+1);
} }
int res= 0;
for(int i = 1;i<=n;i++)
if (f[n][i]>res)
res = f[n][i];
cout<<res<<endl;
return 0;
}`