动态规划的入门级问题,规则如下
长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
加个p | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |
给定长度n,计算出如何分割能获得最大值。
拆分子问题
f
(
n
)
=
M
A
X
[
f
(
n
)
,
f
(
n
−
1
)
+
f
(
1
)
⋅
⋅
⋅
f
(
n
−
k
)
+
f
(
k
)
]
f(n)= MAX[f(n), f(n-1) + f(1)··· f(n-k)+ f(k)]
f(n)=MAX[f(n),f(n−1)+f(1)⋅⋅⋅f(n−k)+f(k)]
其中 k
为给点规则的最大值,本例中为10
自底向上思路
f(0) = 0;
f(1) = 1;
f(2) = MAX[f(2), f(1)+f(2-1)]
...
f(n) = MAX[f(n),] // 类似上面的公式
代码实现
package main
import (
"fmt"
"math"
)
func main() {
// 给定的规则
// 空一位表示0对应的score
list := []int{0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30}
n := 4
fmt.Print(BottomUpCutLine(list, n))
}
func BottomUpCutLine(p []int, n int) []int {
r := make([]int, n+1)
r[0] = 0
for j := 1; j <= n; j++ {
q := int(math.Inf(-1))
for i := 1; i <= j && i <= 10; i++ {
q = Max(q, p[i]+r[j-i])
}
r[j] = q
}
return r
}
func Max(x int, y int) int {
if x < y {
return y
}
return x
}