样例过了但才40,求调

B3637 最长上升子序列

cancan1030 @ 2024-02-06 09:44:21

二分栈解法,样例过了,但才40分 [QAQ]

代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int a[N],b[N],cnt; 
int main(){
    int n;
    cin>>n;
    memset(b,N,sizeof(b));
    b[0]=b[1]=-N;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1,j=0;i<=n;i++){
        if(a[i]<b[j]&&a[i]>b[j-1]){
            b[j]=a[i];
//          for(int k=1;k<=n;k++){
//              cout<<b[k]<<" ";
//          }
//          cout<<endl;
        }
        else if(a[i]>b[j]){
//          cout<<a[i+1]<<" ";
            b[++j]=a[i];
//          for(int k=1;k<=n;k++){
//              cout<<b[k]<<" ";
//          }
//          cout<<endl;
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
} 

by Michelle01 @ 2024-02-06 10:01:58

@cancan1030 这一题用你的这种模拟去找最长上升子序列不太好写。你可以试一下用动态规划


by Michelle01 @ 2024-02-06 10:06:08

@cancan1030 用不到二分栈,用普通的动态规划就行```

include <stdio.h>

include<algorithm>

include<math.h>

include<bits/stdc++.h>

using namespace std;

int main(){

int n;
int ans = 0;
cin >> n;
int dp[100010];
int a[100010];
for(int i = 1; i <= n; i++){
    cin >> a[i];
}
for(int i = 1; i <= n; i++){
    dp[i] = 1;
    for(int j = 1; j <= i - 1; j++){
        if(a[j] < a[i]){
            dp[i] = max(dp[i], dp[j] + 1);
        }
    }
}
for(int i = 1; i <= n; i++){
    ans = max(ans, dp[i]);
}
cout << ans;

return 0;

}


by cancan1030 @ 2024-02-06 10:06:46

@Michelle01 动归的我会写,就是二分栈的更快,我想尝试一下


by Michelle01 @ 2024-02-06 10:08:03

@cancan1030 二分栈里面是有弹出操作的,我没看到你的代码里有。(也许我没看懂你的代码)


by Michelle01 @ 2024-02-06 10:08:55

@cancan1030 你那个b数组相当于一个栈是吧


by cancan1030 @ 2024-02-06 10:09:37

@Michelle01 我这道题AC过,这次主要是想知道这道题用二分栈怎么写


by cancan1030 @ 2024-02-06 10:09:48

@Michelle01 谢谢


by cancan1030 @ 2024-02-06 10:11:06

@Michelle01 嗯对


by Michelle01 @ 2024-02-06 10:26:47

@cancan1030 你的b数组压栈的意义是什么


by cancan1030 @ 2024-02-06 10:32:10

@Michelle01 就是如果x比栈顶元素大就让x入栈,最长上升子序列长度加1


| 下一页