算法学习之路:动态规划-钢条切割-java实现
2017-11-17 15:31
531 查看
钢条切割
public class SteelCutting { public static void main(String[] args) { SteelCutting s = new SteelCutting(); int[] p = new int[] { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 25}; System.out.println(s.extendedBottomUpCutRod(p, 4)); } /** * 递归实现钢铁切割 * @param 下标p * @param 下标n * @return */ int cutRod(int[] p, int n) { if (n == 0) { return 0; } int q = Integer.MIN_VALUE; for (int i = 1; i <= n; i++) { q = max(q, p[i] + cutRod(p, n - i)); System.out.println("执行i="+i+" n="+n+" q="+q); if (i==n){ System.out.println("子问题规模为 "+n+" 的最优值 = "+q); } } return q; } /** * 备忘切割 * @param 数组p * @param 下标n * @return */ int memoizedCutRod(int[] p, int n){ int[] r = new int[n + 1]; for (int i = 0; i <= n; i++) { r[i] = Integer.MIN_VALUE; } return memoizedCutRodAux(p, n, r); } /** * 备忘切割 * @param 数组p * @param 下标n * @param 下标r * @return */ int memoizedCutRodAux(int[] p, int n, int r[]){ if(r >= 0){ return r ; } int q = Integer.MIN_VALUE; if(n == 0){ q = 0; }else { for (int i = 1; i <= n; i++) { q = max(q, p[i] + memoizedCutRodAux(p, n - i, r)); System.out.println("执行i="+i+" n="+n+" q="+q); if (i==n){ System.out.println("子问题规模为 "+n+" 的最优值 = "+q); } } } //将每一次求的长度为 n 的最优值保存在数组 r 里面 r = q; return q; } /** * 自顶向下切割 * @param 数组p * @param 下标n * @return */ int bottomUpCutRod(int[] p, int n){ int[] r = new int[n + 1]; r[0] = 0; int q = Integer.MIN_VALUE; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { q = max(q, p[j] + r[i - j]); System.out.println("执行i="+i+" j="+j+" q="+q); } r[i] = q; System.out.println("子问题规模为 "+i+" 的最优值 = "+q); } return r ; } /** * 自顶向下切割(扩展) * @param 数组p * @param 下标n * @return */ int extendedBottomUpCutRod(int[] p, int n){ int[] r = new int[n + 1]; int[] s = new int[n + 1]; r[0] = 0; int q = Integer.MIN_VALUE; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { if(q < p[j] + r[i - j]){ q = p[j] + r[i - j]; s[i] = j; } System.out.println("执行i="+i+" j="+j+" q="+q); } r[i] = q; System.out.println("子问题规模为 "+i+" 的最优值 = "+q); } System.out.println(s ); return r ; } public int max(int a, int b) { return a > b ? a : b; } }
相关文章推荐
- 算法学习之路:动态规划-最大公共子序列-java实现
- 动态规划之钢条切割问题自底向上发的实现(算法导论第15章)
- C++实现算法导论十五章动态规划之钢条分割问题
- 算法(第四版)学习笔记之java实现能够动态调整数组大小的栈
- 动态规划之钢条切割(算法导论)
- 动态规划的作业排程算法 Java实现
- 动态规划-算法学习之路
- Python实现动态规划切割钢条问题
- 动态规划--钢条切割的C++实现
- 动态规划之钢条切割(算法导论)
- 动态规划:钢条切割问题实现
- 背包算法递归实现,递归转动态规划的一般方法java实现
- 动态规划与钢条切割问题 C++实现
- 算法学习之路:分治策略-最大子数组-java实现
- 算法学习之路:分治策略-归并排序-java实现
- 算法导论 第15章 动态规划:15.1钢条切割
- 算法(第四版)学习笔记之java实现可以动态调整数组大小的栈
- 算法:动态规划-切木头问题(钢条切割问题)
- 动态规划_钢条切割问题
- 动态规划之切割钢条