一、剪绳子

    技术2022-07-11  74

    一、题目描述

    给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

     

    二、解析

    1.首先明确这是动态规划问题

    2.假设f(n)为长度为n的绳子的最大乘积,绳子被砍成两段,第一段长度为i,第二段为n-i,那么有f(n)=max(f(i)*f(n-i)),(f(i),f(n-i)表示长度为i或n-i的绳子的最大乘积,相当于把两段绳子继续剪,还是一样的思路求解),直到绳子剪到长度为1,2,3时候,f(1)=1,f(2)=1,f(3)=2

     

    三、代码实现

    class Solution { public: int cutRope(int number) { int array1[number+1];//对应上面的f(n) array1[1]=1; array1[2]=2;//注意这里的2,3,在2,3时不剪的长度比剪长度长,所以使用不剪的长度 array1[3]=3; for(int i=4;i<=number;i++){ int max=0; for(int j=1;j<i;j++){ int a=array1[j]*array1[i-j]; if(max<a) max=a; } array1[i]=max; } return array1[number]; } };

     

    Processed: 0.017, SQL: 9