最長遞增子串行 動態規劃

2021-10-04 01:14:57 字數 1276 閱讀 4683

問題描述:

輸入一組亂序的資料,輸出這組資料的最長的遞增序列,如輸入x[ ] = (2 8 9 4 6 1 3 7 5 10),則輸出(2 4 6 7 10)

求解最長遞增子串行的問題,我們考慮用動態規劃,而動態規劃,我們就得弄清楚子問題,最終的解決辦法如下:

1.在遍歷資料的過程中,記錄下排第幾的數是哪一位,用l[ ]陣列來記錄,用len來表示當前的最高位的位數;

2.遍歷遇到比最高位還大的數x[i],則len++,記錄l[len] = i;

3.若遍歷的數x[i]比最高位小,則從第一位到最高位遍歷,找到第乙個比x[i]小的數,將這個數替換成x[i];

遍歷函式如下:

for

(i =

1; i <= n; i++

)else}}

}

當然遍歷結束後,我們還要想辦法輸出,此時遍歷之後的結果是這樣的:

記錄的結果是1 3 5 7 10,但我們應該得到的是2 4 6 7 10,問題在哪呢?細心的同學應該發現了,圖上面有乙個「父親」記錄,沒錯,這就是我們輸出所需要的記錄,在原遍歷**中加入:

for

(i =

1; i <= n; i++

)else}}

}

這樣在我們輸出的時候,就可以通過l[len]找到他的父親,再找到他父親的父親…直到len = 0;**如下:

l = l[len]

;while

(l !=0)

最後貼出完整版**:

#include

#include

#include

int x[

1000];

int l[

1000];

int f[

1000];

intdp

(int n)

else}}

}return l[len];}

intmain()

int len =

dp(n)

;printf

("%d\n"

,f[len]);

while

(len !=0)

system

("pause");

return0;

}

最長遞增子串行 動態規劃

include using namespace std int getvalue dequed,listtemp return temp.size void final dequed,listtemp else for auto it temp printf d it int main temp i...

最長單調遞增子串行 動態規劃

給定乙個序列x 0 n 找出它的最長的單調遞增子串行 longest increasing subsequence 使用動態規劃方法。對於i 1,2,n,考慮以xi作為最後項的最長遞增子串行的長度c i 如果在xi項前面存在xj xi 那麼 c i max 1 否則,c i 1.因此,c i max...

最長遞增子串行(動態規劃實現)

題目描述 題目 於牛客網 對於乙個數字序列,請設計乙個複雜度為o nlogn 的演算法,返回該序列的最長上公升子串行的長度,這裡的子串行定義為這樣乙個序列u1,u2.其中ui ui 1,且a ui a ui 1 給定乙個數字序列a及序列的長度n,請返回最長上公升子串行的長度。測試樣例 2,1,4,3...