1. 程式人生 > >7-7 列車排程 (25 分)

7-7 列車排程 (25 分)

7-7 列車排程 (25 分)

火車站的列車排程鐵軌的結構如下圖所示。

兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照{8,4,2,5,3,9,1,6,7}的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條平行鐵軌用於排程?

輸入格式:

輸入第一行給出一個整數N (2 ≤ N ≤10​5​​),下一行給出從1到N的整數序號的一個重排列。數字間以空格分隔。

輸出格式:

在一行中輸出可以將輸入的列車按序號遞減的順序調離所需要的最少的鐵軌條數。

輸入樣例:

9
8 4 2 5 3 9 1 6 7

輸出樣例:

4

類似LIS

程式碼:  

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define lowbit(x) (x&(-x))
#define mem(a,b) memset(a,b,sizeof(a))
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);
using namespace std;
const int maxn = 10000 + 7;
int dp[maxn];
int main(){
    int n,x,len = 0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        if(len==0||dp[len-1]<=x)
            dp[len++] = x;
        else{
            int pos = lower_bound(dp, dp+len, x) - dp;
            dp[pos] = min(dp[pos],x);
        }
    }
    printf("%d\n",len);
}