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

相关文章
相关标签/搜索