最大連續子乘積

2021-10-09 10:02:51 字數 1774 閱讀 4406

寫文章只是為了整理思路嗎,在遠古的學生時代,可能只是為了機試參加個比賽什麼的, 作為一屆老人,早已沒了會點啥就想拿出來炫耀的年紀, 會點除了能混過面試,是不是也能和面試官聊出點感情,程式似乎無可避免悄然而然成了我們生活中心 ,相顧兩無言,唯把**談。

朦朧週末早上起床,昨晚與老友聊此題記憶猶新。 今日把遞推式子寫一下,發現昨晚睡意之下並非完全想的清楚。

拿到這個問題,長的都像動態規劃,你可能很快就興奮的想到乙個二維動態規劃的式子 , 

p (i , j)  = p (i-1, j)  * e(i)
p 是 product (乘積), e  是陣列元素 element(i) 

o(n^2) 的 演算法已經誕生。快速實現一執行,tl (時間超限,這是行業黑話,意思是你這個傻x,有o(n)演算法)

人生就是如此艱難,承認自己菜是不是很難。 

我們來想一維動態規劃演算法. 

我們只需要求出以 e(i)  結尾的最大乘積,其中i= 1,...,n  那麼最終結果就是: 

result = max (pmax(0), pmax(1),  pmax(2), … , pmax(n))
那麼如何求 pmax(i) , 即以 e(i) 結尾的連續最大乘積 ? 不得不說 ,e(i) 必須是最後乙個因子,使得問題簡化了。

繼續想,e(i) 乘以什麼會最大。分兩種情況討論

1. e(i) ≥ 0  ,  期望乘以乙個大正數,即期望pmax(i-1)是個最大非負數。可是pmax(i-1) 最大就是個負數怎麼辦, 那不指望了,e(i)  本身就是最大值。所以

pmax(i)  =  max  (pmax(i-1) * e(i) , e(i)) .

2. e(i) < 0 , 期望乘以乙個最小負數(這樣絕對值大), 負負得正,   如果連負數都沒有, 那也不指望了, e (i),本身就挺大,不要乘了。 但是這最小負數乘積去**找呢。 最小負數可能出現在最小連續乘積 。 當前只要儲存這個值就好了, 寫完下面的式子我們再求 pmin (i) .

pmax(i)   = max (pmin(i-1) * e(i) , e(i))  

繼續出發,如何求 pmin(i), 同樣的思路, 若以e(i) 結尾的連續最小乘積?

1. e(i) ≥ 0, 期望乘以乙個最小負數,這個肯定包含在最小值裡面, 要是連負數都沒有,就別乘了,e(i)本身就最小。所以

pmin(i) = min(pmin(i-1 ) * e(i), e(i))

2. e(i) < 0 ,   期望乘以乙個最大非負數,這個肯定包含在最大值裡面,要是連非負數也沒有,同理就別乘了。所以

pmin = min (pmax(i-1)  * e(i), e(i))

為了清晰一些不妨將以上表示式寫為  

pmax (i) =  max (  pmax(i-1)  *  e(i) ,  pmin (i-1) * e(i), e(i)),

pmin (i) =  min  (  pmin (i-1) * e(i) , pmax(i-1) * e(i), e(i)).

最後

result = max (pmax(0), pmax(1),  pmax(2), … , pmax(n))
**

class solution 

return max_product;

}};

最大連續子串行乘積

問題描述 給定乙個整數序列 可能有正數,0和負數 求它的乙個連續最大子串行乘積,如果乘積為負數,輸出 1 分析 假設陣列為a,直接利用動歸來求解,考慮到可能存在負數的情況,我們用max i 來表示以a i 結尾的最大連續子串行的乘積值,用min i 表示以a i 結尾的最小的連續子串行的乘積值,那麼...

最大連續子串行乘積

推薦 題目描述 給定乙個浮點數序列 可能有正數 0和負數 求出乙個最大的連續子串行乘積。輸入 輸入可能包含多個測試樣例。每個測試樣例的第一行僅包含正整數 n n 100000 表示浮點數序列的個數。第二行輸入n個浮點數用空格分隔。輸入資料保證所有數字乘積在雙精度浮點數表示的範圍內。輸出 對應每個測試...

最大連續子串行乘積

最大連續子串行乘積和最大連續子串行和不同,這裡先回憶一下最大連續子串行和的最優解結構 我們用sum i 來表示以arr i 結尾的最大連續子串行和,則狀態轉移方程為 考慮存在負數的情況 ps 負負會得正 因此我們用兩個輔助陣列,max i 和min i max i 來表示以arr i 結尾的最大連續...