最長子序列之和問題
演算法一:暴力法(時間複雜度:o(n^2))
演算法描述:依次求從j到i中最大的和,並將最大的和記錄在maxvalue中,容易理解但是效率低。
1static
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中情況中的最大值。
1static
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,就應該捨去。(我當時理解了很長時間才理解清楚)
1static
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....