問題描述:
輸入一組亂序的資料,輸出這組資料的最長的遞增序列,如輸入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...