1樓:網友
f[i]表示以a[i]為首個數 在i~n中所能取道的最長的上公升序列。
舉例說吧。a : 2 5 3 4 1
那麼f :3(2,3,4) 1(5) 2(3,4) 1(4) 1 (1)
括號中是取到的最長上公升序列。
2樓:廖昆傑羽傲
有兩種演算法複雜度為o(n*logn)和o(n^2)
o(n^2)演算法分析如下:(a[1]..a[n]存的都是輸入的數)
1、對於a[n]來說,由於它是最後乙個數,所以當從a[n]開始查詢時,只存在長度為1的不下降子序列;
2、若從a[n-1]開始查詢,則存在下面的兩種可能性:
1)若a[n-1]a[n]則存在長度為1的不下降子序列a[n-1]或者a[n]。
3、一般若從a[t]開始,此時最長不下降子序列應該是按下列方法求出的:
在a[t+1],a[t+2],.a[n]中,找出乙個比a[t]大的且最長的不下降子序列,作為它的後繼。
4、為演算法上的需要,定義乙個陣列:
d:array[1..n,1..3]ofinteger;
d[t,1]表示a[t]
d[t,2]表示從i位置到達n的最長不下降子序列的長度。
d[t,3]表示從i位置開始最長不下降子序列的下乙個位置。
最長不下降子序列的o(n*logn)演算法分析如下:
先回顧經典的o(n^2)的動態規劃演算法,設a[t]表示序列中的第t個數,f[t]表示從1到t這一段中以t結尾的最長上公升子序列的長度,初始時設f[t]=0(t=1,2,..len(a))。則有動態規劃方程:
f[t]=max(j=1,2,..t-1,且a[j]d[len],則將a[t]接在d[len]後將得到乙個更長的上公升子序列,len=len+1,d[len]=a[t];否則,在d[1]..d[len]中,找到最大的j,滿足d[j]令k=j+1,則有d[j]在上述演算法中,若使用樸素的順序查詢在d[1]..d[len]查詢,由於共有o(n)個元素需要計算,每次計算時的複雜度是o(n),則整個演算法的時間複雜度為o(n^2),與原來的演算法相比沒有任何進步。但是由於d的特點(2),我們在d中查詢時,可以使用二分查詢高效地完成,則整個演算法的時間複雜度下降為o(nlogn),有了非常顯著的提高。
需要注意的是,d在演算法結束後記錄的並不是乙個符合題意的最長上公升子序列!
這個演算法還可以擴充套件到整個最長子序列系列問題,整個演算法的難點在於二分查詢的設計,需要非常小心注意。
C語言,選擇法排序,對陣列A進行公升序排列,求答案,謝大神
給你個我以前寫的降序的程式,你稍微改下就行了,我懶得改了,include define n 10 main printf 這 d個數從大到小排列為 n n 列印出這十個經排列後的數 for i 0 i printf d a i printf n include include main printf...
求最長的英文單詞
許多人都很想知道,最長的英文單詞是哪乙個?英文單詞成千上萬,其中長詞很多,比如 schistosomiasis 意思是 血吸蟲病 有15個字母 internationalization 意思是 國際管理化 有20個字母。milli millimillillion 意思是10的60億次方,有20個字母...
太陽白羊,月亮巨蟹,上公升巨蟹,求分析
太陽白羊外在表現 自我,勇敢,不妥協,衝動。月亮巨蟹座 她就是月亮女神。這是女神最自如的星座。她內在渴望哺育 關懷 滋養,充滿了女性的關懷,能夠敏感地體悟到他人的情感和需求。月亮女神需要安穩的家庭,她的陰影是對情感的抓住不放,對於家庭的依賴而難以脫離母體。月亮女神通過關心 支援他人而達到滋養自己的情...