一、剪绳子

一、题目描述

给你一根长度为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];
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章