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