python 實現 割繩子問題(劍指offer 14題) 動態規劃 或者貪心算法

一直挺苦惱動態規劃筆試、面試題目,今天開始穩紮穩打的思考解決問題。面試

如題:給你一根長度爲n的繩子,請把繩子剪成m段 (m和n都是整數,n>1而且m>1)每段繩子的長度記爲k[0],k[1],...,k[m].算法

請問k[0]k[1]...*k[m]可能的最大乘積是多少?cdn

例如,當繩子的長度爲8時,咱們把它剪成長度分別爲2,3,3的三段,此時獲得的最大乘積是18.blog

一般動態規劃的問題都是求最優解,即最大或最小值或者最優組合等。這類問題都是能夠從一個大問題分解爲一個小問題,小問題也存在求解最優的狀況。例如,繩子假如被割爲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這個問題就得以解決了。)it

具體實現代碼以下io

從頭開始找規律再想一想好像還有別的方法,有沒有這樣一種最小最優因子,若是將N長的繩子所有由他或者最多由他組成,那麼問題也就解決了。貪心的意思也就是在這裏,我要每段最優,而後組成總體最優。class

例如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)是最優的。List

貪心算法貌似更簡單~lazyload

相關文章
相關標籤/搜索