689.maximum-sum-of-3-non-overlapping-subarrays.go 861 B

1234567891011121314151617181920212223242526272829303132333435
  1. func maxSumOfThreeSubarrays(nums []int, k int) []int {
  2. n := len(nums)
  3. sum := make([]int, n+1)
  4. for i := 1; i <= n; i++ {
  5. sum[i] = nums[i-1] + sum[i-1]
  6. }
  7. dp := make([][][4]int, 3)
  8. // dp[i][j] means the maximum sum of i+1 sub arrays until j,
  9. // dp[i][j] = [4]int{max, i1, i2, i3}
  10. // '-> corresponding index of the maximum
  11. for i := range dp {
  12. dp[i] = make([][4]int, n)
  13. }
  14. for i := 0; i < 3; i++ {
  15. jmax := n - (3-i)*k
  16. for j := i * k; j <= jmax; j++ {
  17. s := sum[j+k] - sum[j]
  18. if i == 0 {
  19. if 0 < j && s <= dp[i][j-1][0] {
  20. dp[i][j] = dp[i][j-1]
  21. } else {
  22. dp[i][j] = [4]int{s, j, 0, 0}
  23. }
  24. continue
  25. }
  26. if ns := dp[i-1][j-k][0] + s; ns <= dp[i][j-1][0] {
  27. dp[i][j] = dp[i][j-1]
  28. } else {
  29. dp[i][j] = dp[i-1][j-k]
  30. dp[i][j][0], dp[i][j][i+1] = ns, j
  31. }
  32. }
  33. }
  34. return dp[2][n-k][1:]
  35. }