動態規劃 最佳加法表示式V2

2022-03-24 07:44:34 字數 3023 閱讀 2850

最佳加法表示式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演算法實現:

1

defmain():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 如果要把所有可能性全部計算出來再找出最小值,這樣計算的時間複雜符是巨大的。換乙個角度思考,從後往前來看 若最後乙個加號新增...