| 1234567891011121314151617181920212223242526272829303132333435 | 
							- func maxSumOfThreeSubarrays(nums []int, k int) []int {
 
- 	n := len(nums)
 
- 	sum := make([]int, n+1)
 
- 	for i := 1; i <= n; i++ {
 
- 		sum[i] = nums[i-1] + sum[i-1]
 
- 	}
 
- 	dp := make([][][4]int, 3)
 
- 	// dp[i][j] means the maximum sum of i+1 sub arrays until j,
 
- 	// dp[i][j] = [4]int{max, i1, i2, i3}
 
- 	//                        '-> corresponding index of the maximum
 
- 	for i := range dp {
 
- 		dp[i] = make([][4]int, n)
 
- 	}
 
- 	for i := 0; i < 3; i++ {
 
- 		jmax := n - (3-i)*k
 
- 		for j := i * k; j <= jmax; j++ {
 
- 			s := sum[j+k] - sum[j]
 
- 			if i == 0 {
 
- 				if 0 < j && s <= dp[i][j-1][0] {
 
- 					dp[i][j] = dp[i][j-1]
 
- 				} else {
 
- 					dp[i][j] = [4]int{s, j, 0, 0}
 
- 				}
 
- 				continue
 
- 			}
 
- 			if ns := dp[i-1][j-k][0] + s; ns <= dp[i][j-1][0] {
 
- 				dp[i][j] = dp[i][j-1]
 
- 			} else {
 
- 				dp[i][j] = dp[i-1][j-k]
 
- 				dp[i][j][0], dp[i][j][i+1] = ns, j
 
- 			}
 
- 		}
 
- 	}
 
- 	return dp[2][n-k][1:]
 
- }
 
 
  |