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

2021-08-27 07:59:43 字數 1553 閱讀 6906

輸入乙個數字組成的字串,給m個加號,將所有加號任意放在字串中中某位置,要求最終得到的加法表示式的結果最小。

輸入:2

123456 

輸出:135

我們用加號的個數作為迭代的依據。建立兩個二維陣列。

第乙個是cur_min[m][n]表示將m個+號放入前n個數字中。根據加法式子的構成我們可以得到兩個條件。1.m=0,即+號個數為0時,剩下的所有前面數字組成的數就是結果. 2. n>m+1,數字的個數一定比加號多乙個,不然加法式子不成立

第二個是nums[n][n]代表所有從n到n的數字的大小。比如123456中n[1][3] = 234

在計算過程中首先迴圈計算前1到n個數字中插入0個加號的大小,等於nums[0][i]

再逐漸加入+。每次加入加號,可以加入的位置都是在m到n-1,因為數字個數必須要比+的個數多1

迭代轉換方程式: cur_min[m][n] = min(cur_min[i][j],cur_min[i-1][p]+nums[p+1][j])   for p = i 到 j

舉例說明迭代轉化方程式比如求4個數字1234插入兩個加號的最小值。就要先迴圈算+,p=2 to 3,

p=2就是cur_min[i-1][p]=1+2;  nums[p+1][j] =34

p=3就是cur_min[i-1][p]=12+3和1+23中的最小的那個,即15;  nums[p+1][j] =4

找出最小就是19

def best_add(m,ints):

nums = [[2**11 for i in range(len(ints))] for j in range(len(ints))]

for i in range(len(ints)):

nums[i][i] = ints[i]

for i in range(len(ints)):

for j in range(i+1,len(ints)):

nums[i][j] = nums[i][j-1]*10+ints[j]

cur_min = [[2**11 for i in range(len(ints))] for j in range(m+1)]

for i in range(len(ints)):

cur_min[0][i] = nums[0][i]

for i in range(1,m+1):

for j in range(len(ints)):

for p in range(i,j):

cur_min[i][j] = min(cur_min[i][j],cur_min[i-1][p]+nums[p+1][j])

return cur_min[m][len(ints)-1]

def main():

m = int(input())

nums=list(str(input()))

nums = [int(i) for i in nums]

print(best_add(m,nums))

if __name__ == '__main__':

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