一直挺苦惱動態規劃筆試、面試題目,今天開始穩紮穩打的思考解決問題。
如題:給你一根長度為n的繩子,請把繩子剪成m段 (m和n都是整數,n>1並且m>1)每段繩子的長度記為k[0],k[1],...,k[m].
請問k[0]k[1]...*k[m]可能的最大乘積是多少?
例如,當繩子的長度為8時,我們把它剪成長度分別為2,3,3的三段,此時得到的最大乘積是18.
通常動態規劃的問題都是求最優解,即最大或最小值或者最優組合等。這類問題都是可以從一個大問題分解為一個小問題,小問題也存在求解最優的情況。例如,繩子假如被割為N段,要達到N段繩子長度成績最大,這個N段的子集都要求為最優情況。所以這就是一個典型的動態規劃問題。
先找規律,如果繩子長度為0,那麼最優為0,如果為1,那麼為一,如果為2,那麼還是為2,如果為3,那麼為2(由於n,m>1所以長度為2時,不能割。當長度為3時,必須割一刀,所以1X2還是2) 不用遞迴用列表就可以實現,試想將繩子從0~N的長度的最優解存在List裡面,然後每次割(不論從哪裡割,都會降為兩個列表內子集的最優解問題這樣就可以解決了。就是說如果繩子長為5,那麼5可以有很多種割法(1,4)(2,3),而1,2,3,4怎麼割的最優解都在List裡,然後pick max value這個問題就得以解決了。)
具體實現程式碼如下
從頭開始找規律再想想好像還有別的方法,有沒有這樣一種最小最優因子,如果將N長的繩子全部由他或者最多由他組成,那麼問題也就解決了。貪心的意思也就是在這裡,我要每段最優,然後組成整體最優。
例如2不能割,3最優分割為3>1X2,4被分割最優為4=2X2,5被分割最優為2x3,6為3X3,我有一個大膽的想法,保證3的個數如果有1為餘數那就減少一個3用來湊成4=2X2(保證不比割前小即可)這樣問題好像還真的就得到了解決。因為2(n-2)與3(n-3)只有在5的時候是相等的,當n大於5的時候3(n-3)是最優的。
貪心演算法貌似更簡單~