寫文章只是為了整理思路嗎,在遠古的學生時代,可能只是為了機試參加個比賽什麼的, 作為一屆老人,早已沒了會點啥就想拿出來炫耀的年紀, 會點除了能混過面試,是不是也能和面試官聊出點感情,程式似乎無可避免悄然而然成了我們生活中心 ,相顧兩無言,唯把**談。
朦朧週末早上起床,昨晚與老友聊此題記憶猶新。 今日把遞推式子寫一下,發現昨晚睡意之下並非完全想的清楚。
拿到這個問題,長的都像動態規劃,你可能很快就興奮的想到乙個二維動態規劃的式子 ,
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 結尾的最大連續...