• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Fourth Dimension Space

            枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            最長不降子序列的nlogn算法 (轉(zhuǎn))

            所謂“最長不降子序列問題”,就是在一個給定的序列中尋找一個子序列{ai}滿足:

                                   a1<=a2<=...<an

            這個問題在一般教材上,往往會作為動態(tài)規(guī)劃的引例。

            即使用如下的狀態(tài)轉(zhuǎn)移方程進行計算:

                               F[i]=max{F[j]}+1     aj<=ai

            但是它的復雜度是O(n^2)的,對于稍大的規(guī)模便無法承受。

            那么有沒有改進的方法呢?答案是肯定的。

            ----------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            我們維護一個數(shù)組C[i],這里C[i]表示F值為i的最小數(shù)。

            不難發(fā)現(xiàn)   C[1]<=C[2]<=...<=C[n]

            因此我們可以利用C[]通過二分查找確定F[j]的值。

            ----------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            實現(xiàn)如下:

            const int N = 1001;

            int a[N], C[N], f[N]; // f[i]用于記錄a[0...i]的最大長度

            int bsearch(const int *C, int size, const int &a)

            {

                int l=0, r=size-1;

                while( l <= r )

                {

                    int mid = (l+r)/2;

                    if( a > C[mid-1] && a <= C[mid] ) return mid; // >&&<= 換為: >= && <

                    else if( a < C[mid] ) r = mid-1;

                    else l = mid+1;

                }

            }

            int LIS(const int *a, const int &n){

                 int i, j, size = 1;

                 C[0] = a[0]; f[0] = 1;

                 for( i=1; i < n; ++i ){

                      if( a[i] <= C[0] ) j = 0;                 // <= 換為: <

                     else if( a[i] >C[size-1] ) j = size++;   // > 換為: >=

                     else j = bsearch(C, size, a[i]);

                     C[j] = a[i]; f[i] = j+1;

                 }

                 return size;

            }

            ------------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            至此,我們了解了O(nlogn)的算法,它主要是利用了二分查找的方法對樸素的動態(tài)規(guī)劃進行加速、優(yōu)化,從而達到理想的效率。



            轉(zhuǎn)自:http://fqq11679.blog.hexun.com/21632261_d.html

            posted on 2009-08-12 18:27 abilitytao 閱讀(415) 評論(0)  編輯 收藏 引用

            久久久久无码精品国产不卡| 97久久精品人人做人人爽| 欧美粉嫩小泬久久久久久久| 久久91精品国产91久| 99久久精品这里只有精品| 久久黄视频| 成人久久久观看免费毛片| 精品多毛少妇人妻AV免费久久| 人人狠狠综合久久亚洲婷婷| 久久久久久久97| 久久er国产精品免费观看8| 欧美777精品久久久久网| 久久亚洲国产精品五月天婷| 久久久噜噜噜www成人网| 久久综合久久鬼色| Xx性欧美肥妇精品久久久久久| 国产午夜免费高清久久影院| 一本色综合网久久| 亚洲伊人久久精品影院| 国产精品久久久天天影视香蕉| 狠狠色婷婷久久一区二区| 精品久久久久久无码人妻热| 99久久精品国产麻豆| 亚洲精品美女久久久久99| 看久久久久久a级毛片| 久久久无码精品亚洲日韩蜜臀浪潮| 日本福利片国产午夜久久| 无遮挡粉嫩小泬久久久久久久| 久久久青草青青国产亚洲免观| 久久夜色tv网站| 99久久婷婷国产综合亚洲| 色婷婷综合久久久中文字幕| 久久无码高潮喷水| 精品国产乱码久久久久久呢| 亚洲人AV永久一区二区三区久久| 久久亚洲精品无码aⅴ大香| 久久精品国产欧美日韩| 99久久国产综合精品五月天喷水| 国产精品成人99久久久久| 99久久精品免费看国产| 久久国产精品免费一区二区三区|