0
已解决
题目描述 Description
求两个长度为 n 的序列 A 和 B 的最长公共上升子序列的长度。1≤n≤3000。
输入描述 Input Description
第一行N,表示A,B的长度。
第二行,串A。
第三行,串B。
输出描述 Output Description
输出长度。
本来以为o(n^3)会TLE,结果竟然过了(数据太水
但是,WA0
#include<iostream>
using namespace std;
int n,ans;
int a[3005],b[3005],f[3005][3005];
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<j;k++)
if(a[i]>b[k]&&f[i][j]<f[i-1][k]+1)
f[i][j]=f[i-1][k]+1;
}
else f[i][j]=f[i-1][j];
}
}
for(int i=1;i<=n;i++)
ans=max(ans,f[n][i]);
cout<<ans;
return 0;
}
0
已采纳
你的问题主要是:
1. 枚举k的那一层循环值判断了f[i-1][k]的情况,没有判断f[k][j-1]的情况
2. else那一个分支,f[i][j-1]的情况你没有考虑
3. 如果a[i]==b[j],你的代码里枚举k的那一层循环也要执行
你试试这样能不能AC
曹灿阳在2021-07-29 20:58:15追加了内容
还有一点,你最后不仅要看max{f[n][j]}还要看max{f[i][m]}
曹灿阳在2021-07-29 20:58:37追加了内容
打错了,是看max{f[i][n]}和max{f[n][i]}
曹灿阳在2021-07-29 21:01:44追加了内容
第3. 点打错了,应该是:如果a[i]==b[j],你的代码里的else那一个分支里的语句也要执行
0
0
0
