0813.最大平均值和的分组

方法一:前缀和 + 记忆化搜索

时间复杂度 $O(n^2 \times k)$,空间复杂度 $O(n \times k)$。

func largestSumOfAverages(nums []int, k int) float64 {
	preSum, n := []int{0}, len(nums)
	for i, v := range nums {
		preSum = append(preSum, preSum[i]+v)
	}
	memo := [101][101]float64{}
	var dfs func(i, k int) float64
	dfs = func(i, k int) float64 {
		if i == n {
			return 0
		} else if k == 1 {
			return float64(preSum[n]-preSum[i]) / float64(n-i)
		} else if memo[i][k] > 0 {
			return memo[i][k]
		}
		ans := 0.0
		for j := i; j < n; j++ {
			t := float64(preSum[j+1]-preSum[i])/float64(j-i+1) + dfs(j+1, k-1)
			if ans < t {
				ans = t
			}
		}
		memo[i][k] = ans
		return ans
	}
	return dfs(0, k)
}