动态规划问题求解的条件:最优解的表示;状态转移方程;边界条件判断。
对于此问题:
1.最优解表示:res[i] 表示 A[0:i]的最优划分对应的值和(res[len(A)]即最终结果);
2.状态转移方程:
r
e
s
[
i
]
=
r
e
s
[
i
−
l
e
n
(
l
a
s
t
S
u
b
A
)
]
+
m
a
x
(
l
a
s
t
S
u
b
A
)
∗
l
e
n
(
l
a
s
t
S
u
b
A
)
,
1
<
=
l
e
n
(
l
a
s
t
S
u
b
A
)
<
=
k
.
res[i]=res[i-len(lastSubA)]+max(lastSubA)*len(lastSubA) ,1<= len(lastSubA) <=k.
res[i]=res[i−len(lastSubA)]+max(lastSubA)∗len(lastSubA),1<=len(lastSubA)<=k.
- lastSubA表示A[0:i]的最优划分的最后一个子数组
3.边界条件判断:res[i]=max(A[0:i])*i , 1 <= i <= k
编程实现(参考的别人的代码):
# -*- coding: utf-8 -*-
__date__ = '2019/12/29 21:48'
def main(A, k):
n = len(A)
dp = [0] * (n+1)
for i in range(1, n+1):
j = i-1
maximum_ele = float('-inf')
while i-j <= k and j >= 0:
# 由于不知道lastSubA的大小,因此对lastSubA的所有可能都进行计算,取最大的
maximum_ele = max(maximum_ele, A[j])
dp[i] = max(dp[i], dp[j] + maximum_ele*(i-j))
j -= 1
# print(dp)
return dp[-1]
A = [1, 15, 7, 9, 2, 5, 10]
print(main(A, 3))