最佳加法表示式v2描述給定n個1到9的數字,要求在數字之間擺放m個加號(加號兩邊必須有數字),使得所得到的
加法表示式的值最小,並輸出該值。例如,在1234中擺放1個加號,最好的擺法就是12+34,和為36
輸入有不超過15組資料
每組資料兩行。第一行是整數m,表示有m個加號要放( 0<=m<=50)
第二行是若干個數字。數字總數n不超過50,且 m <= n-1
輸出對每組資料,輸出最小加法表示式的值
樣例輸入
2123456
1123456
412345
樣例輸出
102579
15遞推實現:dp[i][j]表示j個加號插入i個數的最小加法表示式。為了計算方便,第0行增加多個最大值,
i表示有多少個數字,j列表示有多少個加號
這裡假設最大值是999999.
舉例:3個加號,"12345"5個數字
遞推的步驟:先計算每一行的第1列,沒有放入加號最小值的情況。
第2次迴圈,計算每行,有1個加號最小值的情況;
第3次迴圈,計算每行有2個加號最小值的情況;
第4次迴圈,計算每行有3個加號最小值的情況;
舉個資料說明:比如dp[4][2]=19的計算過程,表示4個數字,插入2個加號
那麼這個k的值只有2或者3可以選擇。
當如果是2時,表示「12」插入1個加號的最小值+34,因此等於dp[2][1]+34=37
當如果是3時,表示「123」插入1個加號的最小值+4,因此等於dp[3][1]+4=19,
19的值最小,因此dp[4][2]=19
因為我們都是把加入1個加號的最小值都計算出來了,當計算加入2個加號的時候,就可以利用
上1個加號的最小值,從而實現遞推第2個加號的最小值。
通過不斷的遞推,二維列表的最後一行一列的值,既是整個表示式所求的最小值。
# matrix_value[i][j]表示數字串num_list[n]的第i位到第j位之間的數字串表示的陣列
# 把輸入的數字字串,把每個位置數字的值存在二維陣列,假設m=3,n=12345,
# 為了方便從1開始計算,所以多增加0為第一行,其陣列內容為:
[[0, 0, 0, 0, 0, 0],
[0, 1, 12, 123, 1234, 12345],
[0, 0, 2, 23, 234, 2345],
[0, 0, 0, 3, 34, 345],
[0, 0, 0, 0, 4, 45],
[0, 0, 0, 0, 0, 5]]
dp[i][j] 表示前i個數字放入j個加號的最小加法表示式值
[[999999, 999999, 999999, 999999],
[1, 999999, 999999, 999999],
[12, 3, 999999, 999999],
[123, 15, 6, 999999],
[1234, 46, 19, 10],
[12345, 168, 51, 24]]
python演算法實現:
1defmain():2#
m個加號
3 m =int(input())4#
numlist把陣列字串轉換為列表
5 num_list =list(str(input()))6#
n個數字
7 n =len(num_list)8#
把n個數字的值存在乙個二維陣列中
9 matrix_value = [[0] * (n+1) for i in range(n+1)]10#
dp[i][j] 表示前i個數字放入j個加號的最小加法表示式值
11 dp = [[999999] * (m+1) for i in range(n+1)]
12 num_list = [int(i) for i in
num_list]13#
為了遍歷從1開始計算,所以在前面再增加個0
14num_list.insert(0, 0)15#
matrix_value二維陣列儲存字串數字構成的各種數值
16for i in range(1,len(num_list)):
17for j in
range(i,len(num_list)):
18 matrix_value[i][j] = matrix_value[i][j - 1] * 10 +num_list[j]19#
i表示有幾個數字,0表示沒有加號的情況,比如dp[2][0]表示,2個數字0個加號表示式的值
20 dp[i][0] = matrix_value[1][i]
2122#遞推
23#遍歷加號個數,從放1個加號開始遞增,m個加號
24for j in range(1,m+1):25#
遍歷2個、3個……直到n個數字,保證數字個數大於加號個數,求其表示式的加法最小值26#
比如,放1個加號,至少需要2個數字,所以數字的個數i=j+1
27for i in range(j+1,n+1):28#
在有i個數字的情況下遍歷最後乙個加號可能的位置,k表示在第k個數後放加號29#
因為dp[k][j-1]之前已經計算好了,表示在k這個位置放入看j-1個加號30#
的最小值之前已經計算過,所以能直接使用,即遞推的原理。31#
這裡k表示放最後乙個加號的位置因為可能有很多個,所以需要遍歷找到最小值的那個
32for k in
range(j,i):
33 dp[i][j] = min(dp[i][j], dp[k][j-1] + matrix_value[k+1][i])
3435
print("
加法最佳表示式的最小值:%.2f
"%dp[-1][-1])
3637
38if
__name__ == '
__main__':
39 main()
動態規劃 最佳加法表示式
總時間限制 1000ms 記憶體限制 65536kb 描述 給定n個1到9的數字,要求在數字之間擺放m個加號 加號兩邊必須有數字 使得所得到的加法表示式的值最小,並輸出該值。例如,在1234中擺放1個加號,最好的擺法就是12 34,和為36 輸入有不超過15組資料 每組資料兩行。第一行是整數m,表示...
最佳加法表示式(動態規劃)
一 題目描述 描述 給定n個1到9的數字,要求在數字之間擺放m個加號 加號兩邊必須有數字 使得所得到的加法表示式的值最小,並輸出該值。例如,在1234中擺放1個加號,最好的擺法就是12 34,和為36 輸入 有不超過15組資料 每組資料兩行。第一行是整數m,表示有m個加號要放 0 m 50 第二行是...
動態規劃之最佳加法表示式
有乙個由1.9組成的數字串.問如果將m個加號插入到這個數字串中,各種可能形成的表示式中,值最小的那個表示式的值是多少?假設數字串的長度為n,有m個括號,插入的所有可能性為n m 如果要把所有可能性全部計算出來再找出最小值,這樣計算的時間複雜符是巨大的。換乙個角度思考,從後往前來看 若最後乙個加號新增...