最長子序列問題之系列一

2022-02-23 09:07:42 字數 1458 閱讀 4977

求解最大連續子串行和問題,最直接的辦法就是求出每個連續子串行的和,然後找出最大和即可,但這種演算法的效率為o(n^2),**如下,

int

ls()

}return

max;

}

這種演算法適用於資料量比較小的情況。

在這種方法裡, 有許多不必要的重合計算,而正是這些不必要的計算影響了程式的執行效率。為了提高演算法的效率,盡可能的排除那些不必要的計算過程,可以採用一下演算法,此演算法效率為o(n).

此演算法的改進之處就在於消除了前乙個演算法出現多次重複的弊端。

//該演算法滿足連續子串行求和問題:sum>=0的情況

//如果有最大和為負數的情況,可以以特殊情況單獨處理即可

for(i=0

;i<

n;i++

)

if(sum

<0)

//關鍵點,消除不必要的重複

}

演算法思想:

對於每個a[i]而言,在和前一次的sum相加後都會進行一次比較, 

if(sum>max)

, 其中start記錄最大連續子串行的起始位置,end記錄其結束位置 ,而在如果出現sum<0的情況 ,直接將sum=0; 因為對於任何乙個子串行來說,在保證了其sum>=0的前提下,出現負數是不可能的,故可將其直接清0;而此時需對起始位置進行記錄,以便下一次如果出現sum>max的情況,則可為start重新賦值。 

此處還有乙個需要注意的地方就是0max的情況。

做題的時候碰到了兩種情況:

(1)  上面的過程就是解決這個問題的

(2)因為上面的出現保證了sum>=0的情況,所以 對上面的演算法做乙個小處理就ok了,處理如下:

排除都為負數的情況

排除最大和為0的情況

**如下,

for(i=

0;i<

n;i++)if

(sum

<0)

}if(max

>

0) cout

<<

max<<""

<<

a[start-1

]<<""

<<

a[end-1

]<<

endl;

else

if(count!=n

&&max==0

) cout

<<

max<<""

<<

a[l]

<<""

<<

a[l]

<<

endl;

else

cout

<<

max<<""

<]<<""

<<

a[n-1]

<<

endl;

最長子序列問題

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

最長子序列

最長子序列可以說是剛接觸動態規劃的人經常遇見也不得不解決的問題,最常見的有兩種,一種是最長公共子串行 lcs 還有乙個是最長上公升子串行 lis 今天我就總結下這兩個的做法。一 最長公共子串行 lcs 題目描述 給你兩個陣列,可以是數字的,也可以是字串,我們假設是數字的!舉個例子 x 1,5,6,4...

最長子序列

在做oj題目的時候,經常會用到字串的處理。例如,比較二個字串相似度。這篇文章介紹一下求兩個字串的最長公共子串行。乙個字串的子串行,是指從該字串中去掉任意多個字元後剩下的字元在不改變順序的情況下組成的新字串。最長公共子串行,是指多個字串可具有的長度最大的公共的子串行。include includech...