#45907: 解題思路


henry.rem.rem@gmail.com (*ฅ́˘ฅ̀*)

學校 : 臺北市立松山高級中學
編號 : 278368
來源 : [1.161.41.35]
最後登入時間 :
2025-05-05 21:10:22
i402. 4. 內積 -- 2022年6月APCS | From: [36.224.179.135] | 發表日期 : 2025-04-27 20:37

解題思路:

首先由題目測資量 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 中的最大值。

在跑完整個陣列後,即可得出要求的最大區間連續和。

範例解法

 
ZeroJudge Forum