二分優化 單調遞增子串行(二)NYOJ(214)

2021-09-29 02:58:29 字數 1018 閱讀 9658

例題:

題解:該題很資料量很大用傳統的動態規劃演算法寫,會tle,所以需要用二分優化演算法,我們可以定義乙個棧stack,可以說是單調棧,利用二分查詢,保持棧的單調行,從一層for迴圈裡找到每乙個ans所在的位置

以樣例1為例:

1910

511213

stack[1]

=a[0

]先把第乙個值入棧

123

4519

1011

13這是最大的遞增子串行,而二分思路是記錄了a[ ]中每乙個的位置

主要操作:

一開始先入棧

stack:[1

][9]

[10]第四個數5二分查詢它的位置是2,替代9此時說明以5為尾的最大長度是2,之後不斷更

新入棧多少個最大長度就是top的大小

ac**:

#include

.h>

using namespace std;

//二分優化最長遞增子串行

#define maxn 100005

int stack[maxn]

;int a[maxn]

;int n;

intlower_ans

(int l,

int r,

int i)

//返回剛好比l大1的位置

else

}return l;

}void

slove_dp()

else

}printf

("%d\n"

,top);}

intmain()

slove_dp();}}

最長遞增子串行!!!(DP ,二分)

最長遞增子串行 time limit 1000 ms memory limit 32768 k total submit 158 64 users total accepted 68 56 users rating special judge no description 給出乙個數字序列求其最長的...

NYOJ 214 單調遞增子串行 二 (二分優化)

描述給定一整型數列 0如 1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。輸入有多組測試資料 7 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡有n個整數,表示數列中的所有元素.每個整形數中間用空格間隔開 0 include usin...

NYOJ 214 單調遞增子串行 二

先開設乙個陣列dp 然後從第乙個數開始列舉,和dp 陣列中的最後乙個元素end 進行比較,如果大於end 直接把這個數接到end 的後面,並且把end 更新為列舉的這個數。如果不大於edn 在dp 陣列中找到第乙個大於這個數的位子 k,並用這個數 替換掉dp k 例如 x 5,dp 則列舉過x 之後...