最長子序列問題 最詳細的解題報告

2022-07-07 04:18:12 字數 1250 閱讀 6718

最長子序列之和問題

演算法一:暴力法(時間複雜度:o(n^2))

演算法描述:依次求從j到i中最大的和,並將最大的和記錄在maxvalue中,容易理解但是效率低。

1

static

int maxsum1(int

arr) 10}

11}12return

maxvalue;

13 }

演算法二:分治法(時間複雜度:o(nlogn))

演算法描述:將整個序列分成兩部分,序列最大和有三種情況:

1、在左邊子串行中;

2、在右邊子串行中;

3、一部分在做序列中,另一部分在有序列中,但是該序列一定包含左子串行的最後乙個元素mid,和又子串行的第乙個元素mid+1。

對於第1、2中情況,直接遞迴就可以了;對於第3中情況,需要從左子串行的mid出發,依次遞減,求得最大值midleftsum,再從右子串行的第乙個元素mid+1出發,依次遞增,求得最大值midrightsum,最後要求的值為:midleftsum+midrightsum。

整個序列的最大和為第1、2和3中情況中的最大值。

1

static

int maxsum2(int arr, int start, int

end)

7 } else19}

2021

int midrightmaxvalue = 0;

22int midrightsum = 0;

23for (int i = mid + 1; i <= end; i++) 28}

29 maxvalue = math.max(leftmaxvalue, math.max(rightmaxvalue, midleftmaxvalue +midrightmaxvalue));30}

31return

maxvalue;

32 }

演算法三:動態規劃(時間複雜度:o(n))

演算法描述:首先我們想一下,要想為最大子串行之和做貢獻,該元素一定要大於0,所以如果第i個子序列之前的子串行之和小於0,就應該捨去。(我當時理解了很長時間才理解清楚)

1

static

int maxsum3(int

arr)

9if(cursum<0)12}

13return

maxvalue;

14 }

最長子序列問題

引子 洛谷p1020,飛彈攔截 問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所...

最長子序列的問題求解

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

動態規劃 最長子序列問題

最長公共子串行 x和y的公共子串行中長度最長的 包含元素最多的 叫做x和y的最長公共子串行。思路 設x x1x2 xm和y y1y2 yn是兩個序列,z z1z2 zk是這兩個序列的乙個最長公共子串行。1.如果xm yn,那麼zk xm yn,且zk 1是xm 1,yn 1的乙個最長公共子串行 2....