最長公升序列求解(OJ 1093)

2021-05-25 01:47:37 字數 1040 閱讀 4864

bupt acm oj: 1093

最長公升序列 submit: 1370   accepted:446 time limit: 1000ms  memory limit: 65536kdescription

給出乙個序列,求出此序列的最長公升序列。

input

第一行有乙個正整數t(t < 10),表示測試資料的數量。

每組測試資料一行,先給出乙個正整數n(n < 300),接下來是n個正整數組成的序列,求此序列的最長公升序列。

output

每組測試資料佔一行,輸出乙個正整數s,表示最長公升序列的長度

sample input

24 1 2 2 4

4 2 4 2 6

sample output33

上面該題就是求解最長公升序列,自己先做了一遍,是wa,還覺得是伺服器判斷錯誤,發現是自己讀題錯誤。原來我在求解時候只要發現有元素大於之前的最大元素就加入到最長公升序子串行,這樣是不正確的,例如24346,最長公升序應該是2346,而按照我的做法變成了246,少了。發現這個問題,沒我想得那麼簡單,丟人啊~~

看了半天網上的演算法,發現對動態規劃演算法算是看明白了。這裡mark一下。

設f(i)表示l中以ai

為末元素的最長遞增子串行的長度。則有如下的遞推方程:

這個遞推方程的意思是,在求以

ai為末元素的最長遞增子串行時,找到所有序號在l前面且小於

ai的元素

aj,即jaji

。如果這樣的元素存在,那麼對所有

aj,都有乙個以

aj為末元素

的最長遞增子串行的長度f(j),把其中最大的f(j)選出來,那麼f(i)就等於最大的f(j)加上1,即以ai

為末元素的最長遞增子串行,等於以使f(j)最大的那個

aj為末元素的遞增子串行最末再加上

ai;如果這樣的元素不存在,那麼

ai自身構成乙個長度為1的以

ai為末元素的遞增子串行。

if(a[j]b[i]) b[i]=b[j]+1;//b[j]+1>b[i]保證了b[j]是i-1之前的最長公升序長度

最長遞增子串行求解

演算法難,難於上青天 搞懂乙個演算法不容易,還是寫篇部落格為以後複習做好準備 include define n 1000 using namespace std int getlongcommonsub int a 6 int dp 6 int n return dp i 1 int main in...

最長子序列的問題求解

給你一組資料 比如1 7 4 5 6 8 9 7個資料 求出這一組資料中的最長公升序子串行的長度 為了這個問題糾結了很久,由於自己沒有學習什麼動態規劃 所以看了別人的說法也是沒法完全明白。為了簡化問題,只求長度 換個思路 假設我們先定下來最長的子串行的末端,比如說是1 那麼初始的原則就是只有乙個1,...

最長公共子串行求解

求多個字串的最長公共子串行可以轉化為逐步求2個字串的最長公共子串行來求解直至收斂,雖然過程會比較複雜一些。下面的 將採用動態規劃的方法來求解2個字串的最長公共子串行的問題,當然裡面還包含了測試例子 關於本 的詳情解釋請看演算法導論第二版 機械工業出版社 15章動態規劃15.3,看了你再執行 你會更容...