問題1:最長上公升子串行問題(lis)
分析:設d(i)為以i為結尾的最長上公升子串行的長度,則d(i)=max ( j的值為1,2,3,...,i-1且aj一種時間複雜度是o(nlogn)的方法。假設已經計算出的兩個狀態a和b滿足aaa且i>b)來說,a並不會比b差——如果b滿足 ab這樣對於相同的d值,只需保留a最小的乙個。對於d[i]=k,我們用g[k]表示滿足d值等於k的所有a[i]中的最小值。即g[k]=min(d[i]=k)。
設當前已經求出的最長上公升子串行長度為len,先判斷a[i]與g[len],若a[i]>g[len],把a[i]接在g[len]之後得到乙個更長的上公升子串行,len=len+1,g[len]=a[i];否則, 在g[1]...g[len]中找到最大的j,滿足g[j]在上述演算法中,如果用樸素的順序查詢g[1]...g[len],由於有o(n)個元素要查詢,每次查詢的時間複雜度是o(n),所以整體複雜度是o(n^2)。但由於g[len]有如下特點:g[1]for(int i=1;i<=n;i++) g[i]=inf;
for(int i=0;iint k=lower_bound(g+1,g+1+n,a[i]) - g;
d[i]=k;
g[k]=a[i];
函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置
舉例如下:
乙個陣列number序列為:4,10,11,30,69,70,96,100.設要插入數字3,9,111.pos為要插入的位置的下標
則pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number陣列的下標為0的位置。
pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number陣列的下標為1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number陣列的下標為8的位置(但下標上限為7,所以返回最後乙個元素的下乙個元素)。
所以,要記住:函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置,且last的位置是越界的!!~
返回查詢元素的第乙個可安插位置,也就是「元素值》=查詢值」的第乙個元素的位置
動態規劃總結
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 12 7 近期學了幾個動態規劃正好總結一下。裡面不涉及具體問題的具體解法,有問題可以參看我的具體型別的講解部落格。目前所見動態規劃可以劃分為兩類 鏈式和樹形。而且這兩類中的每個節點都是乙個完整的狀態集合。一 鏈式動態規劃 鏈式動態規劃的題...
動態規劃 總結
動態規劃是解決多階段決策問題的一種方法。如果一類問題的求解過程可以分為若干個互相聯絡的階段,在每乙個階段都需作出決策,並影響到下乙個階段的決策,從而確定了乙個過程的活動路線,則稱它為多階段決策問題。思想 在做每一步決策時,列出各種可能的區域性,解依據某種判定條件,捨棄那些肯定不能得到最優解的區域性解...
動態規劃總結
一 知識點整理 一 動態規劃是解決多階段策略問題的一種方法,運用最優性原理,排除重複計算,用空間換時間的演算法。二 動態規劃適用的題目型別有以下幾個特點 1.問題具有多階段的決策 2.每個階段對應乙個狀態 狀態變數 3.每個階段有乙個決策 不同的決策導致下乙個階段不同的狀態 4.每個階段的最優解可以...