不解:为什么不同的解决方式结果不同

B3637 最长上升子序列

Painted_pears @ 2024-03-10 20:29:00

如果以sort排序在存储最长序列的f[i]中找到最大值(代码如下)只有四十分

#include<bits/stdc++.h>
using namespace std;
int a[100001],f[100001],len=0;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    f[1]=1;
    for(int i=2;i<=n;i++){
        for(int j=1;j<=i-1;j++){
            if(a[i]>a[j]) f[i]=max(f[i],f[j]+1);
        }
    }
    sort(f+1,f+n+1);
    cout<<f[n];
    return 0;
}

但是用循环一层层寻找其中的最大值可以得到满分

#include<bits/stdc++.h>
using namespace std;
int a[100050],f[100050],maxn=0;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        f[i]=1;
    }
    for(int i=2;i<=n;i++){
        for(int j=1;j<i;j++){
            if(a[i]>a[j]) f[i]=max(f[i],f[j]+1);
        }
    }
    for(int i=1;i<=n;i++) maxn=max(maxn,f[i]);
    cout<<maxn;
    return 0;
}

请问dalao们这两种方法时间都不会爆啊,有什么区别吗qwq


by rant @ 2024-03-21 19:23:30

要加这个for(int i=1;i<=n;i++) f[i] = 1; 一开始要将所有的都初始化为1, 你可以试试这个样例:3 : 3 1 2 你就发现第一个错了。


|