最長上公升子串行的長度

2021-08-14 15:20:29 字數 992 閱讀 4987

描述

在一條單車道的公路上有n輛汽車行駛,從前向後第i輛車的最高速度是vi。

所有車輛都會盡量保持最高速度行駛。不過由於只有單車道,所以當後方快車追上前方慢車後,無法超車,只能降速跟在慢車後面。

於是經過足夠長時間(足夠後方快車追上前方慢車)的行駛後,某些車輛會聚成一隊以相同的速度向前行駛。我們把這些聚成一隊的車輛稱為乙個」車隊」。不同車隊之間的距離會越來越大。

例如假設有5輛車,速度依次是[3, 5, 4, 1, 2],則經過足夠長時間行駛後,第1、2、3輛會聚成乙個車隊,第4、5輛會聚成另乙個車隊。

現在假設你可以」拿掉」其中一些車輛,但不能改變剩餘的車輛的前後次序和最高速度。請計算最少」拿掉」多少輛車,可以使得剩餘的車輛數目恰好等於剩餘車輛經過足夠長時間行駛後形成的車隊數量。(換句話說每輛車單獨乙個車隊)

在上例中」拿掉」第一輛和第四輛之後,[5, 4, 2]會最終形成3個車隊,滿足條件。

輸入 第一行包含乙個整數n。

第二行包含n個整數v1, v2, … vn。

對於30%的資料,1 ≤ n ≤ 1000

對於100%的資料,1 ≤ n ≤ 100000, 1 ≤ vi ≤ 100000, vi保證兩兩不同。

輸出 乙個整數表示答案。

樣例輸入

5 3 5 4 1 2

樣例輸出

2可用二分搜尋法,開闢一陣列儲存最長上公升子串行的長度,時間複雜度o(nlogn)。若求最長上公升子串行,該方法不可用。

#include

#include

#include

#include

using

namespace

std;

int main()

dp[low] = v[i];}}

cout

<< n-dp.size() << endl;

return

0;}

最長上公升子串行的長度

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。演算法的時間複雜度應該為 o n 2 inclu...

最長上公升子串行 LIS 長度

屬於簡單的經典的dp,求最長上公升子串行 lis 先研究了o n 2 的思路。令a i 表示輸入第i個元素,d i 表示從a 1 到a i 中以a i 結尾的最長子序列長度。對於任意的0 j i 1,如果a j a i 則a i 可以接在a j 後面形成乙個以a i 結尾的新的最長上公升子串行。對於...

最長上公升子串行求長度

普通dp 複雜度o 2 1 include 2 using namespace std 34 const int n 1010 5 inta n dp n n 67 intmain 1819 int res 0 20 for int i 1 i n i 21 res max res,dp i 222...