解題思路:
首先由題目測資量 1 ≤ n, m ≤ 1000 ,可以發現 O(nm) 的複雜度是能被容許的。
而暴力窮舉的做法,會需要測試全部共
min(n, m) 種區間長度 * max(n, m) 種數字配對 * min(n, m) 次乘積計算,
大約會是 O(n2m) 或是 O(nm2),無法通過所有測資。
從這個方向下去思考,或許會想到可以利用 sliding window 的技巧,壓縮乘積計算的時間至O(1),
但由於窗格滑動時,數字相乘的對象也會改變,無法以這種方式解決。
那麼壓縮其他部分的運算量呢?
由於內積運算需要區間乘積加總,不同的數字配對會令區間內積的數值不同,
使得數字配對的計算部分無可避免,必須全部試過,才有辦法找出最大區間內積。
因此我們只能考慮避免測試所有區間長度。
在已知必須窮舉全部數字配對的情況下,回歸題目敘述,
我們可以試著在計算各種數字配對乘積的途中,
將這一連串的乘積視為一個新的陣列,我們的任務就變成了尋找這些陣列的最大區間連續和。
實作策略:
尋找最大區間連續和當然有許多方法,而最適合這題,不需要考慮區間長度的作法,則是
固定從陣列最前端開始往後枚舉,同時維護
包含當前配對乘積的最大和 sum 以及歷史最大和 maxSum 兩個變數,
讓 sum 逐個加上配對的乘積,一旦其低於 0 便重設為 0 ,
因為這代表其以前的區間對於總和的貢獻是負的,不該納入最大總和。
maxSum 則隨時保持在 maxSum 和 sum 中的最大值。
在跑完整個陣列後,即可得出要求的最大區間連續和。