最大子串行乘積 DP求解

2022-09-18 20:24:11 字數 948 閱讀 7664

問題起源於《資料結構與演算法分析-c語言描述》一書中的習題2.12。

存在序列a(a1,a2,......,an ),(在此僅討論序列a中元素均為整數的情況)

問:給出有效的演算法求解最大子串行乘積。

一看此題,容易想到的是窮舉所有的可能的子串行,求乘積後去最大值,**如下。

1

int maxproduct(int a, int

len)212

}1314return

max;

15 }

view code

此演算法的複雜度容易計算得o(n2)。

根據書中對最大子串行和問題的線性演算法求解,進一步探索對該問題的線性求解得可能性。

同樣的,從問題的最終解的形式出發,假設序列a最大乘積的子串行為(ai,ai+1,....aj)。

由此假設p(k)為以ak結尾的子串行的最大乘積,n(k)為以ak結尾的子串行的最小乘積。

定義遞推公式如下:

若 ak > 0;  p(k) = ak * p(k-1),  n(k) = ak * n(k-1);

ak = 0;  p(k) = n(k) = 0;

ak < 0;  p(k) = ak * n(k-1),  n(k) = ak * p(k-1);

**實現如下:

1

int maxproduct(int a, int

len)214

else

if(a[i] > 0)15

19else

if(a[i] < 0)20

2526 max = max>thismax?max:thismax;27}

2829

return

max;

30 }

view code

容易計算得到該演算法計算複雜度為o(n)。

乘積最大子串行

比如,序列 2,3,2,4 中乘積最大的子串行為 2,3 其乘積為6。方法一 自己一開始寫的方法比較麻煩。通過記錄陣列中元素為0的下標,然後以0為邊界,分割陣列,然後對每個分割後的陣列分別求最大乘積子串行,最後在所有的分割陣列的最大乘積子串行中取最大乘積。class solution int len...

最大子串行乘積

思路 以元素i結尾序列提供的最大正數記做 pos,最小負數記做 nag a n 大於零時 pos n max max value max 若n 1位置存在最小負數,更新 nag n nag n 1 a n a n 小於零時 pos n max max value max 更新 nag n min a...

乘積最大子串行

給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。由於存在負數,那麼最大的數可能變最小的數,最小的...