我在处理这个问题时遇到了记忆化和自底向上的算法困难:
假设你有一个元素数组xi,满足对于所有0 < i < N,-10000 < xi < 10000。尝试找到T个元素(T < N),使它们排列在不同的子数组中,以获得最大总和。我们不会将每个子数组的第一个元素相加,并且还必须返回子数组的数量K。
例如:
当T = 4, 数组为3 9 1 1 7 => (3 9)和(1 7)具有最大和16 = 9 + 7,K = 2
当T = 4, 数组为3 9 6 3 7 => (3 9 6 3)具有最大和18 = 9 + 6 + 3,K = 1
当T = 9, 数组为14 11 18 1 1 16 12 18 0 0 11 18 9 5 14 => 连续子数组为(14 11 18)(1 16 12 18)(11 18),K = 3,max_sum = 11 + 18 + 16 + 12 + 18 + 18 = 93
当T = 15, 数组为6 19 -29 15 9 -4 5 27 3 12 -10 5 -2 27 10 -2 11 23 -4 5 => 连续子数组为(6 19) (-29 15 9) (5 27 3 12) (-2 27 10) (-2 11 23),K = 5,max_sum = 19 + 15 + 9 + 27 + 3 + 12 +27 + 10 + 11 + 23 = 156。
我到目前为止做的是:
令f[i][j][0]表示使用j个插槽时前i个插槽的最大和,第i个插槽未使用。
令f[i][j][1]表示使用j个插槽时前i个插槽的最大收益,第i个插槽已使用。
显然,f[i][j][k]可以确定f[i+1][j][k]或f[i+1][j+1][k]
详细信息:
假设你有一个元素数组xi,满足对于所有0 < i < N,-10000 < xi < 10000。尝试找到T个元素(T < N),使它们排列在不同的子数组中,以获得最大总和。我们不会将每个子数组的第一个元素相加,并且还必须返回子数组的数量K。
例如:
当T = 4, 数组为3 9 1 1 7 => (3 9)和(1 7)具有最大和16 = 9 + 7,K = 2
当T = 4, 数组为3 9 6 3 7 => (3 9 6 3)具有最大和18 = 9 + 6 + 3,K = 1
当T = 9, 数组为14 11 18 1 1 16 12 18 0 0 11 18 9 5 14 => 连续子数组为(14 11 18)(1 16 12 18)(11 18),K = 3,max_sum = 11 + 18 + 16 + 12 + 18 + 18 = 93
当T = 15, 数组为6 19 -29 15 9 -4 5 27 3 12 -10 5 -2 27 10 -2 11 23 -4 5 => 连续子数组为(6 19) (-29 15 9) (5 27 3 12) (-2 27 10) (-2 11 23),K = 5,max_sum = 19 + 15 + 9 + 27 + 3 + 12 +27 + 10 + 11 + 23 = 156。
我到目前为止做的是:
令f[i][j][0]表示使用j个插槽时前i个插槽的最大和,第i个插槽未使用。
令f[i][j][1]表示使用j个插槽时前i个插槽的最大收益,第i个插槽已使用。
显然,f[i][j][k]可以确定f[i+1][j][k]或f[i+1][j+1][k]
详细信息:
f[i+1][j+1][1]=max(f[i+1][j+1][1],f[i][j][0],f[i][j][1]+G[i+1]);
f[i+1][j][0]=max(f[i+1][j][0],f[i][j][0],f[i][j][1]);
T=4, array = 3 9 1 1 7 => (3 9 1 1 7) 具有最大和18 = 9 + 1 + 1 + 7,K = 1
? - anatolyg