动态规划举例(python)
import time
content = [3, -4, 2, -1, 2, 6, -5, 4]
# 动态规划求连续子序列最大和
N = len(content)
Ln = [0] * N
Ln[N-1] = content[N-1]
start_t = time.time()
for i in range(N-1).__reversed__():
Ln[i] = max(0, Ln[i+1]) + content[i]
L = max(Ln)
end_t = time.time() - start_t
print(Ln)
print(L)
print(end_t)
# 穷举法
N = len(content)
Ln = [0] * N
start_t = time.time()
for i in range(N):
totle = 0
Ln[i] = content[i]
for j in range(i, N):
totle += content[j]
if(Ln[i] < totle):
Ln[i] = totle
L = max(Ln)
end_t = time.time() - start_t
print(Ln)
print(L)
print(end_t)
# 递归型穷举法
N = len(content)
Ln = [0] * N
def fun(i):
totle = content[i]
if i >= N-1:
return totle
temp = fun(i+1)
if (temp < 0):
return totle
else:
totle += temp
return totle
start_t = time.time()
for i in range(N):
Ln[i] = fun(i)
L = max(Ln)
end_t = time.time() - start_t
print(Ln)
print(L)
print(end_t)
# 递归剪枝
N = len(content)
Ln = [0] * N
mm = {}
def fun(i):
totle = content[i]
if i >= N-1:
return totle
[3, -4, 2, -1, 2, 6, -5, 4]
if i in mm:
temp = mm[i]
else:
temp = fun(i+1)
mm[i] = temp
if (temp < 0):
return totle
else:
totle += temp
return totle
start_t = time.time()
for i in range(N):
Ln[i] = fun(i)
L = max(Ln)
end_t = time.time() - start_t
print(Ln)
print(L)
print(mm)
print(end_t)