三种算法实现最大子段和问题(Java实现)
2013-04-17 11:17
721 查看
分别用简单实现(比较容易理解但时间复杂度较高)、分治法、动态规划法实现
public class MaxSum { // 最大子段和简单算法 public static void maxSumSimp(int arr[], int bestx, int besty) { int n = arr.length, sum = 0; for (int i = 1; i <= n; i++) { int thissum = 0; for (int j = i; j <= n; j++) { thissum += arr[j - 1]; if (thissum > sum) { sum = thissum; bestx = i; besty = j; } } } System.out.println("简单算法最优值:" + sum); System.out.println("最优解:" + bestx + "-->" + besty); } // 最大子段和分治实现 public static int maxSumDiv(int[] arr, int left, int right) { int sum = 0; if (left == right) { sum = arr[left] > 0 ? arr[left] : 0; } else { int center = (left + right) / 2; int leftSum = maxSumDiv(arr, left, center); int rightSum = maxSumDiv(arr, center + 1, right); int s1 = 0; int lefts = 0; for (int i = center; i >= left; i--) { lefts += arr[i]; if (lefts > s1) { s1 = lefts; } } int s2 = 0; int rights = 0; for (int i = center + 1; i <= right; i++) { rights += arr[i]; if (rights > s2) { s2 = rights; } } sum = s1 + s2; if (sum < leftSum) { sum = leftSum; } if (sum < rightSum) { sum = rightSum; } } return sum; } // 最大子段和动态规划法实现 public static void maxSumDp(int[] arr) { int sum = 0, b = 0, n = arr.length, bestx = 0, besty = 0; for (int i = 1; i <= n; i++) { if (b > 0) { b += arr[i - 1]; } else { b = arr[i - 1]; bestx = i; } if (b > sum) { sum = b; besty = i; } } System.out.println("动态规划算法最优值:" + sum); System.out.println("最优解:" + bestx + "-->" + besty); } public static void main(String[] args) { int[] arr = { 2,5,-3,4,-9,44,32,22,11,-30 }; for (int i : arr) { System.out.print(i + " "); } System.out.println(); System.out.println("最大子段和:"); System.out.println("分治算法最优值:" + maxSumDiv(arr, 0, arr.length - 1)); System.out.println("===================="); maxSumDp(arr); System.out.println("===================="); maxSumSimp(arr, 0, 0); } }
相关文章推荐
- 三种算法求最大子段和问题——Java实现
- 三种算法求最大子段和问题——Java实现
- 算法java实现--分支限界法--最大团问题
- 算法java实现--回溯法--最大团问题
- 最大子段和问题(这里给出三种算法)
- 三种算法求最大公约数——Java实现
- java实现最大子序列问题——————性能最优的算法
- 最大子数组问题(三种方式,java实现)
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 【算法数据结构Java实现】Java实现动态规划(背包问题)
- 算法java实现--贪心算法--最小生成树问题--Prim算法
- 最大子序列算法的JAVA实现
- Top k问题的讨论(三种方法的java实现及适用范围)
- java线程:三种方式实现生产者消费者问题_1
- java实现二叉树的三种遍历算法(递归)
- Java 线程同步问题 生产者-消费者 算法实现 -Java学习笔记(29)
- 算法java实现--动态规划--电路布线问题
- 汉诺塔问题的算法分析与实现(Java)
- 算法java实现--回溯法--n后问题
- 算法java实现--动态规划--0-1背包问题