Problem 2 Largest Sum of Averages
Step 3: Induction Rule
dp[k][i] = 假设考虑切点切在了左大段长度为j
Max (dp[k - 1][j] + sum[j...i] /i-j+1)
Max(左大段 + 右小段)
左大段的长度j是任意的么?
左大段要继续把j长度的item分割为k-1份,左大段的长度最少也得有k-1这么长
Step 4: fill in order
dp[k - 1][j] , dp[k][i]
从上到下,从左到右
public double largestSumAverage(int[] array, int k) {
// assume array is valid
double[][] dp = new double[k+1][array.length + 1];
double[] prefixSum = new double[array.length + 1];
for (int i; i <= array.length; i++) {
prefixSum[i] = prefixSum[i - 1] + array[i - 1];
}
// base case
for (int i = 1; i <= array.length; i++) {
dp[1][j] = prefixSum[i]/i;
}
// 把长度为j东西,分成i份:dp[i][j]
for (int i = 2; i <= k; i++) {
for (int j = i; j <= array.length; j++) { // 长度
if (i = j) {
dp[i][j] = dp[i - 1][j - 1] + array[j- 1]/ 1;
}
else {
for (int leftLength = i - 1; leftLength < j; leftLength++) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][leftLength] + (prefixSum[j] - prefixSum[leftLength]) / (j - leftLength));
}
}
}
}
return dp[k][array.length];
}
TC: O(NK*N) ==> O(N^2 *K)
SC: KN-> N
Method 2:
其实存一行就行了dp[k][n] only depends on dp[k-1][n2]存一行就可以
Induction Rule
dp[k - 1][n2] --- dp[k][n]
假如现在只有一行
[last row n2 <- current row n]
更新顺序要改变
from right to left:你左边的值都是还没有更新过的值
Last updated