poj 1631 最長上公升子串行 nlogn

2021-06-08 11:58:04 字數 637 閱讀 7628

題目挺長的,就是說 一開始 有一些連線,左邊1~n 跟右邊 1~n 相連,現在要你 刪除一些連線,使得剩下的連線最多,並且剩下的連線不相交。。其實就是求最長上公升子串行;

但是 n 的範圍 是 40000,n^2 的演算法是不行的,需要 nlogn的演算法。

演算法分析,我們可以維護乙個 c陣列,這個c陣列 儲存的是 對長度 為 到目前為止最長上公升子串行 最後 乙個 值,同時這個值 是最小的,比如 最長 長度 為 3 的時候 1 3 6 和 1 3 5

都是符合條件的,但是 很明顯,最後乙個 值 c[3]取 5 是較優的。。

那麼,可以看出 c 陣列 實際上是 單調 遞增的,每次我們判斷新的乙個值的時候,就可以 進行二分查詢,查詢 c 陣列裡面 比 當前要加入的數 小的 最後乙個數,返回 它的下乙個位置 放上 該數,就可以得到乙個 盡量長的 序列。。

#include#includeusing namespace std;

const int maxn=40005;

int a[maxn],c[maxn];

int t,n;

int bsearch(int size,int val)

return size;

}int main()

}

poj1631 dp,最長上公升子串行

題目描述 給你兩列點,共2n個 對於1 n著n個數,每個數給定乙個對應的數xi,表示左邊的點i與右邊的點xi相連,求問這些連線中,最大的不交叉的連線數量 可以觀察樣例 我們可以發現,滿足不交叉這一條件的必要條件是對於i所以,我們就可以發現,這是一道最長上公升子串行的問題 因為資料範圍是n 40000...

最長上公升子串行

問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...

最長上公升子串行

最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...