问题标题: 酷町堂:4142 最长公共上升子序列

0
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
我要回答