题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
解题思路:
先进行举例说明:
2===1 1=1
3===1 2=2
4===2 2=4
5===2 3=6
6===3 3=9
7===3 4=3 2 2=12
由此可看,从5开始,后续的子绳子长度都有3.可能有2也可能没有
那我们来构造动态规划的答案
我们求长为i的绳子的最大乘积。
有两种情况:
一:前一个里有2,则可以直接把2变成3,也可以结合一个3形成两个2,求乘积最大值即可
二:前一个里没有2,则只能结合3变成两个2,求乘积
针对于2和3和4 的特殊情况要进行特殊处理赋值。
因为4里没有3,但是也有2.所以要不就特殊处理,因为只有一个。否则需要判断是否含有3.计算量更大
上一篇找规律结果: 语言:Java 运行时间: 12 ms 占用内存:9532K
动态规划结果: 语言:Java 运行时间: 11 ms 占用内存:9780K
动态规划代码如下:注释部门为找规律代码
public class Solution { public int cutRope(int target) { // //12ms 9532kb 直接找规律 // if(target==2){ // return 1; // }else if(target==3){ // return 2; // }else{ // int n1=target/3; // int n2=target%3; // if(n2==0){ // return (int)Math.pow(3,n1); // } // else if(n2==1){ // return 2*2*(int)Math.pow(3,n1-1); // }else{ // return 2*(int)Math.pow(3,n1); // } // } if(target==2){ return 1; } else if(target==3){ return 2; } else if(target==4){ return 4; } else if(target==5){ return 6; } else{ int[] ans=new int[target]; ans[1]=1; ans[2]=2; ans[3]=4; ans[4]=6; for(int i=5;i<target;i++){ if(ans[i-1]%2==0){ ans[i]=Math.max(ans[i-1]/2*3,ans[i-1]/3*4); } else{ ans[i]=ans[i-1]/3*4; } } return ans[target-1]; } } }