package offer;
import java.util.Scanner;
public class Solution14 {
public static void main(String[] args) {
System.out.println("请输入绳子长度:");
Scanner scanner = new Scanner(System.in);
int length = scanner.nextInt();
Solution14 sl = new Solution14();
long optimal1 = sl.dynamic(length);
long optimal2=sl.greed(length);
System.out.println("动态规划的最优解为:" + optimal1);
System.out.println("贪婪算法的最优解为:" + optimal2);
}
public int dynamic(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[j] * products[i - j];
if (max < product)
max = product;
products[i] = max;
}
}
max = products[length];
return max;
}
public int greed(int length) {
if (length < 2)
return 0;
if (length == 2)
return 1;
if (length == 3)
return 2;
// 尽可能多地剪去长度为3的绳子段
int timesOf3 = length / 3;
// 当绳子剩下的长度为4的时候,不能再剪去长度为3的绳子段
// 此时更好的方法是把绳子剪成长度为2的两段,因为2x2>3x1
if (length - timesOf3 * 3 == 1)
timesOf3 -= 1;
int timesOf2 = (length - timesOf3 * 3) / 2;
return (int) (Math.pow(3, timesOf3)) * (int) (Math.pow(2, timesOf2));
}
}
《剑指offer》练习-面试题14-剪绳子
最新推荐文章于 2020-07-09 09:56:00 发布