有乙個由1..9組成的數字串.問如果將m個加號插入到這個數字串中,各種可能形成的表示式中,值最小的那個表示式的值是多少?
假設數字串的長度為n,有m個括號,插入的所有可能性為n!/m!。如果要把所有可能性全部計算出來再找出最小值,這樣計算的時間複雜符是巨大的。
換乙個角度思考,從後往前來看:若最後乙個加號新增完畢,由於無論加號的位置怎樣變化,最後乙個加號後面的數值是乙個確定的值,那麼整個表示式的最小值就是最後乙個加號後面的數值加上加號前面的表示式的最小值。
我們假設有m個數字和n個加號,最後乙個加號放在了第i個數字的後面,
再假設m個數字和n個加號組成表示式的最小值為min(m,n),
且第i個數字到第n個數字組成的數值為num(i, n),
則有min(m,n) = num(i+1,m) + min(i, n-1)。而min(i, n-1)可以繼續看成是有m-1個數字和i和加號的表示式的最小值。
。。。這是什麼?
上述推導式每一層表示式都在求最小的值,而最後的值需要從後往前一層一層分解為乙個個子問題,這不正好是動態規劃的特點嘛!
所以我們可以採用動態規劃的思想來考慮這個問題。
在上面的推導中其實已經給出了動態規劃中最關鍵的狀態轉移方程,下面我們只需要考慮:它的最原始狀態是怎樣的?
當只有乙個加號時,我們需要將這乙個加號在每個數字間放一下,看看最小的放置位置在哪;若沒有加號,毫無疑問,最小值就是這n個數字形成的數值。 所以,初始狀態也有了:當加號個數n為0時,min(m,n) = num(0,m)。據此,我們就可以寫出最佳加法表示式的動態規劃解法。
這裡需要強調一點,就是在寫狀態轉移方程式要注意i的取值:第i個數字後是最後乙個加號。i的最小值為:當前n-1個加號擠在一起,比如1+2+3+4+i,第i個數字前有n-1個數字,此時i對應的是第n個數字;i的最大值為:最後乙個加號在最後乙個數字前面,此時i對應的是第m-1個數字。由於數**演算法則的約束,加號的個數不能多於數字的個數減一,所以i的迴圈範圍為for(i = n; i<=(m-1); i++)。
#include
using
namespace
std;
#define max_len 10
#define inf 2100000000
char a[max_len]; //存放數字字串的
int l[max_len][max_len]; //存放結果的二維陣列
//begin 與 end 均為下標
int my_atoi(char *a, int begin, int end)
return result;
}int my_min(int a, int b)
else
if(n >= len)
l[len-1][n] = inf;
else
}l[len-1][n] = t;
}
return l[len-1][n];
}int main()
#include
using
namespace
std;
#define max_len 6
#define inf 2100000000
char a[max_len]; //存放數字字串的
int l[max_len][max_len]; //存放結果的二維陣列
//begin 與 end 均為下標
int my_atoi(char *a, int begin, int end)
return result;
}int my_min(int a, int b)
for (z = j; z//z為最後乙個加號前的數字的編號
//i個數字,j個加號組成的值的最小值
//等於 編號z+1到i的數字組成的數值 加上 l[z][j-1] 的最小值
l[i][j] = my_min(l[i][j], l[z][j-1]+my_atoi(a, z, i-1));}}
}return l[len][n];
}int main()
}result = bae(a, len, n);
cout
<< result<< endl;
return
0;}
動態規劃 最佳加法表示式
總時間限制 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 第二行是...
Python 動態規劃 最佳加法表示式
輸入乙個數字組成的字串,給m個加號,將所有加號任意放在字串中中某位置,要求最終得到的加法表示式的結果最小。輸入 2 123456 輸出 135 我們用加號的個數作為迭代的依據。建立兩個二維陣列。第乙個是cur min m n 表示將m個 號放入前n個數字中。根據加法式子的構成我們可以得到兩個條件。1...