给定一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]* k[1] * … *k[m]可能的最大乘积是多少?
解析:
//动态规划剪绳子 初始为1,2,3 则可以直接判断最大极为0,1,2 大于等于四时候,则开始有选择的剪。使得两边成绩最大
public class maxProduct {
public int maxProductAfterCutting_solution(int length) {
if(length<2)
return 0;
if(length==2)
return 1;
if(length==3)
return 2;
int[] products = new int[length+1];
products[0]=0;
products[1]=1;
products[2]=2;
products[3]=3;
int max=0;
for(int i=4;i<length;++i) {
max=0;
for(int j=1;j<=i/2;j++) {
int product = products[i-j]*products[j];
if(max<product)
max =product;
products[i]=max;
}
}
max = products[length];
return max;
}
//贪心算法在对问题求解时,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解;
//选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关;
//题目贪婪策略:当n>=5时,尽可能多地剪长度为3的绳子;当剩下的绳子长度为4时,把绳子剪成两段长度为2的绳子。
int maxProductAfterCutting(int length) {
if(length<2)
return 0;
if(length==2)
return 1;
if(length==3)
return 2;
int timesOf3 =length/3;
if(length-timesOf3*3==1) {
timesOf3--;
}
int timesOf2 = (length-timesOf3*3)/2;
return (int) ((Math.pow(3,timesOf3))*(Math.pow(2,timesOf2)));
}
}