动态规划-最佳加法表达式V1

最佳加法表达式V1:
描述
给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的
加法表达式的值最小,并输出该值。例如,在1234中摆放1个加号,最好的摆法就是12+34,和为36
输入
有不超过15组数据
每组数据两行。第一行是整数m,表示有m个加号要放( 0<=m<=50)
第二行是若干个数字。数字总数n不超过50,且 m <= n-1
输出
对每组数据,输出最小加法表达式的值

样例输入
2
123456
1
123456
4
12345
样例输出
102
579
15
"""

"""
递归实现:
设V(m,n)表示在n个数字中插入m个加号所能形成的表达式最小值。
假定数字串长度是n,添完加号后,表达式的最后一个加号添加在第i个数字后面,
那么整个表达式的最小值,就等于在前i个数字中插入 m – 1个加号所能形成的
最小值,加上第i+1到第n个数字所组成的数的值。
设V(m,n)表示在n个数字中插入m个加号所能形成的表达式最小值,那么:
if m = 0
V(m,n) = n个数字构成的整数
else if n < m + 1
V(m,n) = ∞
else
V(m,n) = Min{ V(m-1,i) + Num(i+1,n) } ( i = m … n-1)
i的最小的取值是m,因为如果再小了,m个加号就放不完,对i的从m至n-1每个位置都
遍历,计算出多个V(m,n)的值,取最小值既是答案。
"""

# 把输入的数字字符串,把每个位置数字的值存在二维数组,假设m=2,n=1234,
# 为了方便从1开始计算,所以多增加0为第一行,其数组内容为:
# [[0, 0, 0, 0, 0],
# [0, 1, 12, 123, 1234],
# [0, 0, 2, 23, 234],
# [0, 0, 0, 3, 34],
# [0, 0, 0, 0, 4]]

python算法实现:
 1 matrix_value = []
 2 
 3 
 4 def V(m, n):
 5     global matrix_value
 6     # m个加号,n个数字
 7     if m == 0:
 8         return matrix_value[1][n]
 9     elif n < m+1:
10         # 说明加号过多,没法放完加号,所以条件不成立,返回无穷大
11         # n个数字,最多可以放n-1个加号,n-1=m,这个就是m的最大值,如果n-1<m,说明m加号过多
12         return float('inf')
13     else:
14         #初始假设无穷大是最小值
15         min_value = float("inf")
16         for i in range(m, n):
17             temp = V(m-1, i) + matrix_value[i+1][n]
18             min_value = min(min_value, temp)
19 
20         return min_value
21 
22 
23 def main():
24     # m个加号
25     m = int(input())
26     # numList把数组字符串转换为列表
27     num_list = list(str(input()))
28     # n个数字
29     n = len(num_list)
30     # 把n个数字的值存在一个二维数组中
31     global matrix_value
32     matrix_value = [[0] * (n+1) for i in range(n+1)]
33     num_list = [int(i) for i in num_list]
34     #为了遍历从1开始计算,所以在前面再增加个0
35     num_list.insert(0, 0)
36     # matrix_value二维数组存储字符串数字构成的各种数值
37     for i in range(1,len(num_list)):
38         for j in range(i,len(num_list)):
39             matrix_value[i][j] = matrix_value[i][j - 1] * 10 + num_list[j]
40     min_value = V(m, n)
41     print("加法最佳表达式的最小值:%.2f"%min_value)
42 
43 
44 if __name__ == '__main__':
45     main()

 



posted @ 2020-05-27 18:55  StudyNLP  阅读(281)  评论(0编辑  收藏  举报