不多bb,直接上代码
/*
*1. 以剑指Offer的切绳子问题为例,演示回溯法、动态规划法、贪婪算法的基本思想,以及它们之间的区别
*/
public class Algorithms {
public static void main(String[] args) {
int lengthOfScope = 13;
System.out.println("dynamicProgramingAlgorithm:" + dynamicProgramingAlgorithm(lengthOfScope));
System.out.println("divideAndConquerAlgorithm:" + divideAndConquerAlgorithm(lengthOfScope));
System.out.println("greedyAlgorithm:" + greedyAlgorithm(lengthOfScope));
}
/*
*动态规划算法的四个特征
* 1. 用于求问题的最优解(最大值/最小值)
* 2. 整体问题的最优解依赖于各子问题的最优解
* 3. 原问题分解得到的若干子问题,子问题继续分解得到更小的子问题,这些小问题之间有重叠的问题(重叠问题越多,动态规划算法相对于分治法的效率越高)
* 4. 从上往下分析问题,从下往上解决问题
*/
/*
*动态规划法解决切绳子问题(常规思路)
* 1. 使用数组arr保存子问题1、2、3...的结果,数组长度为问题个数(包括原问题)
* 2. 计算顺序从下往上,即先根据arr[0]计算arr[1],再根据arr[1]计算arr[2],依此类推,直到arr[length-1]
* 3. 返回arr[length-1],既为原问题求解结果
* 4. arr[0]为基本问题,不可再分,可以通过分析得到
* 5. 动态规划法解决切绳子问题的时间复杂度为O(n^2)
*/
public static int dynamicProgramingAlgorithm(int length){
//绳子长度为0、1、2、3时,由于规定必须切一刀,按特殊情况处理
if(length <= 1){
return 0;
}else if(length ==