给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
分析:在这个问题中,其实就是一个动态规划问题,首先假如长度为n,那么你可以把他看成是maxF=max(f(i)f(n-i)),然后把问题细化,又可以求出maxf(i)=max(f(j)f(i-j)),总而言之,就是把大的问题细化,这里可以用递归实现,但是他时间要的长,所以我们可以将每一个长度的值存入一个数组,那么就可以逐步从小到大求出当绳子多长时最大的值为多少:

if(length==0)
            return 0;
        else if(length==1)
             return 1;
        else if(length==2)
             return 1;
        else if(length==3)
           return 2;
        int[] prducts=new int[length+1];
        prducts[0]=0;
        prducts[1]=1;
        prducts[2]=2;
        prducts[3]=3;
        int max=0;
        for(int i=4;i<=length;i++)
        { max=0;
        for(int j=1;j<=i/2;j++)
        {
            if(prducts[j]*prducts[i-j]>max)
                max=prducts[j]*prducts[i-j];
            prducts[i]=max;
        }

        }
       return prducts[length];