/*
* 给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。
* 每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]* k[1]*……*k[m]可能的最大乘积是多少?
* 例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此 时得到最大的乘积18。
*/
public class CutRope {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int product = maxProduct(n);
System.out.println(product);
}
static int f(int n) {//递归解法 重复率高
if( n == 1) {
return 1;
}
if( n == 2) {
return 2;
}
if(n == 3) {
return 3;
}
int max1 = 0;
for( int i = 4; i <= n; i++) {
for( int j = 1; j <= i/2; j++) {
if(max1 < f(i-j)*f(j)) {
max1 = f(i-j)*f(j);
}
}
}
return max1;
}
static int maxProduct(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;
for(int i = 4; i <= length; i++) {
for(int j = 1; j <= i/2; j++) {
int product = products[j] * products[i-j];
if(product > products[i]) {
products[i] = product;
}
}
}
return products[length];
}
}
剪绳子
最新推荐文章于 2020-04-27 22:07:34 发布