楼主: 
JIWP (JIWP)   
2024-12-29 01:09:07689. Maximum Sum of 3 Non-Overlapping Subarrays
思路:
dp
用三个dp矩阵
dp1[i][0] : 表示到nums[i]为止长度k的subarray sum的最大值
dp1[i][1] : 为该subarray的起始index
dp2[i][0] : 表示到nums[i]为止2个长度为k且不重叠的subarray sum的最大值
dp2[i][1] : 为第1个subarray的起始index
dp2[i][2] : 为第2个subarray的起始index
dp3[i][0] : 表示到nums[i]为止3个长度为k且不重叠的subarray sum的最大值
dp3[i][1] : 为第1个subarray的起始index
dp3[i][2] : 为第2个subarray的起始index
dp3[i][3] : 为第3个subarray的起始index
dp1应该不用说明怎么求
dp2的话
假设sum为nums[i-k+1]~nums[i]的总和
那dp2的状态方程式为 dp2[i][0] = max(dp2[i-1][0] , sum+dp1[i-k] )
然后记得跟着更新dp2[i][1]、dp2[i][2]
dp3则是从dp2得到的,状态方程式跟dp2差不多
最后回传dp3[n-1][1:]就好
golang code :
func maxSumOfThreeSubarrays(nums []int, k int) []int {
        n := len(nums)
        dp1 := make([][2]int, n)
        dp2 := make([][3]int, n)
        sum := 0
        for i := 0; i < k; i++ {
                sum += nums[i]
        }
        dp1[k-1] = [2]int{sum, 0}
        for i := k; i < n; i++ {
                sum -= nums[i-k]
                sum += nums[i]
                if sum > dp1[i-1][0] {
                        dp1[i] = [2]int{sum, i - k + 1}
                } else {
                        dp1[i] = [2]int{dp1[i-1][0], dp1[i-1][1]}
                }
                if sum+dp1[i-k][0] > dp2[i-1][0] {
                        dp2[i][0] = sum + dp1[i-k][0]
                        dp2[i][1] = dp1[i-k][1]
                        dp2[i][2] = i - k + 1
                } else {
                        dp2[i] = dp2[i-1]
                }
        }
        dp3 := make([][4]int, n)
        sum = 0
        for i := 2 * k; i < k; i++ {
                sum += nums[i]
        }
        dp3[3*k-1] = [4]int{sum + dp2[2*k-1][0], dp2[2*k-1][1], dp2[2*k-1][2], 2 * k}
        for i := 3 * k; i < n; i++ {
                sum += nums[i]
                sum -= nums[i-k]
                if sum+dp2[i-k][0] > dp3[i-1][0] {
                        dp3[i] = [4]int{sum + dp2[i-k][0], dp2[i-k][1], dp2[i-k][2], i - k + 1}
                } else {
                        dp3[i] = dp3[i-1]
                }
        }
        return dp3[n-1][1:]
}