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