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

2021-08-05 22:42:41 字數 1269 閱讀 8363

題目描述:

(題目**於牛客網)對於乙個數字序列,請設計乙個複雜度為o(nlogn)的演算法,返回該序列的最長上公升子串行的長度,這裡的子串行定義為這樣乙個序列u1,u2...,其中ui < ui+1,且a[ui] < a[ui+1]。

給定乙個數字序列a及序列的長度n,請返回最長上公升子串行的長度。

測試樣例:

[2,1,4,3,1,5,6],7
返回:4

解法:題目要求複雜度為o(nlogn),我們可以這樣想,肯定是要遍歷陣列,這裡的複雜度就是o(n),那麼我們在每個數那裡就最多用到o(logn)的複雜度,其實我思路也挺亂的,直

接說做法吧,我們先用乙個輔助陣列b,(長度為a.length+1,不能用list鍊錶,複雜度會超過要求),b[0]=0(這個沒用),b[1] = a[0],length =2,length記錄陣列b的實際長

度,以後b[1]記錄長度為1 的有序序列的的最小值,b[2]記錄長度為2有序序列的最小值(例如1,3,2)b[2]就記錄2,因為長度為2的有序序列有(1,3)和(1,2),依次類推,得來

的b陣列肯定是非遞增有序序列,我們在遍歷到a[k]的時候,只需要在b陣列中去查詢比a[k]大的第乙個最小數的,返回其位置,在陣列b中若這一位置還是0,說明a[k]是最多的,

可以將其置為a[k],若有值,可以將其改為a[k],最後陣列b的長度-1就是結果(減一是因為b[0]沒有用)package dynamic;

public class dynamic2

; int n = 7;

int num = da(a, n);

system.out.println(num);

} // 演算法思想,用乙個陣列,記錄最長子序列長度從1到n對應的最小數

private static int da(int a, int n)

return length-1;

} // 查詢a[i]在b中對應的情況,找到比a[i]小的那個數的最大數,例如b[2]==3,現在查詢4,

// 那麼b[3]=4,最長子序列可以加1

private static int select(int b, int start, int end, int k)

return i;// 返回那個與k相等的那個數(若有多個,取最大的額那個)的下標

} else if (b[middle] > k)

else

} else

else

}}}

最長遞增子串行 動態規劃

問題描述 輸入一組亂序的資料,輸出這組資料的最長的遞增序列,如輸入x 2 8 9 4 6 1 3 7 5 10 則輸出 2 4 6 7 10 求解最長遞增子串行的問題,我們考慮用動態規劃,而動態規劃,我們就得弄清楚子問題,最終的解決辦法如下 1.在遍歷資料的過程中,記錄下排第幾的數是哪一位,用l 陣...

最長遞增子串行 動態規劃

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...