`
yanguz123
  • 浏览: 556066 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

\(^_^)/ 最大子序列和的问题求解

    博客分类:
  • Code
 
阅读更多

参考:http://blog.163.com/lichunliang1988116@126/blog/static/2659944320124115795/

参考:http://blog.csdn.net/sgbfblog/article/details/8032464

参考:http://blog.csdn.net/luxiaoxun/article/details/7438315

 

 

 

import java.util.Random;

public class SubSequence {
	public static void main(String[] args) {
		int[] array = new int[10000];
		Random random = new Random();
		for (int i = 0; i < array.length; i++) {
			array[i] = random.nextInt(1000);
		}
		long start = System.currentTimeMillis();
		System.out.println(maxSubSequence1(array));
		long end = System.currentTimeMillis();
		System.out.println("Cost:" + (end - start));

		start = System.currentTimeMillis();
		System.out.println(maxSubSequence2(array));
		end = System.currentTimeMillis();
		System.out.println("Cost:" + (end - start));

		start = System.currentTimeMillis();
		System.out.println(maxSubSequence3(array, 0, array.length - 1));
		end = System.currentTimeMillis();
		System.out.println("Cost:" + (end - start));

		start = System.currentTimeMillis();
		System.out.println(maxSubSequence4(array));
		end = System.currentTimeMillis();
		System.out.println("Cost:" + (end - start));
	}

	public static int maxSubSequence1(int[] array) {
		int maxSum = 0;
		for (int i = 0; i < array.length; i++) {
			for (int j = i; j < array.length; j++) {
				int tempSum = 0;
				for (int k = i; k <= j; k++) {
					tempSum += array[k];
				}
				if (tempSum > maxSum) {
					maxSum = tempSum;
				}
			}
		}
		return maxSum;
	}

	public static int maxSubSequence2(int[] array) {
		int maxSum = 0;
		for (int i = 0; i < array.length; i++) {
			int tempSum = 0;
			for (int j = i; j < array.length; j++) {
				tempSum += array[j];
				if (tempSum > maxSum) {
					maxSum = tempSum;
				}
			}
		}
		return maxSum;
	}

	public static int maxSubSequence3(int[] array, int left, int right) {
		if (left == right) {
			if (array[left] > 0) {
				return array[left];
			} else {
				return 0;
			}
		} else {
			int center = (left + right) / 2;
			int maxLeftSum = maxSubSequence3(array, left, center);
			int maxRightSum = maxSubSequence3(array, center + 1, right);

			int maxLeftBorderSum = 0, leftBorderSum = 0;
			for (int i = center; i >= left; i--) {
				leftBorderSum += array[i];
				if (leftBorderSum > maxLeftBorderSum) {
					maxLeftBorderSum = leftBorderSum;
				}
			}

			int maxRightBorderSum = 0, rightBorderSum = 0;
			for (int i = center + 1; i <= right; i++) {
				rightBorderSum += array[i];
				if (rightBorderSum > maxRightBorderSum) {
					maxRightBorderSum = rightBorderSum;
				}
			}

			int max = maxLeftSum;
			if (max < maxRightSum) {
				max = maxRightSum;
			}
			if (max < maxLeftBorderSum + maxRightBorderSum) {
				max = maxLeftBorderSum + maxRightBorderSum;
			}
			return max;
		}
	}

	public static int maxSubSequence4(int[] array) {
		int maxSum = 0, tempSum = 0;
		for (int i = 0; i < array.length; i++) {
			tempSum += array[i];
			if (tempSum > maxSum) {
				maxSum = tempSum;
			} else if (tempSum < 0) {
				tempSum = 0;
			}
		}
		return maxSum;
	}

}

 

 

分享到:
评论

相关推荐

    最大子序列和问题求解源代码

    2010.09.07 用分治法求解最大子序列问题。...《数据结构与算法分析 C++描述》p42最大子序列问题的递归方法代码 2010.09.07 vector a的内容: 4 -3 5 -2 -1 2 6 -2 最大子序列和是:11 请按任意键继续. . .

    最大子序列和问题 C++ 代码实现

    最大子序列和问题(Maximum Subarray Sum Problem)是求解一个数组中连续子数组的和的最大值的问题。

    算法实验-串匹配问题-采用分治法求解最大连续子序列和问题-用分治策略求众数问题-最近点对问题

    例如: 序列(-2,11,-4,13,-5,-2)的最大子序列和为20序列; (-6,2,4,-7,5,3,2,-1,6,-9,10,-2)的最大子序列和为16。 3.用分治策略求众数问题 问题描述:给定含有n个元素的多重集合S,每个元素在...

    求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列

    求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列. http://blog.csdn.net/ssuchange/article/details/17341693

    最大子段和(分治法)源码

    用分治法求最大子段和,适合刚接触数据结构的初学者

    如何求解字符串中字典序最大的子序列

    问题描述 给定一个字符串,求字符串中字典序最大的子序列.字典序最大的子序列是这样构造的:给定一个字符串 a0a1…an−1a_{0}a_{1}…a_{n-1}a0​a1​…an−1​ ,首先在字符串中找到值最大的字符 aia_{i}ai​,然后在...

    python实现最大子序和(分治+动态规划)

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶: ...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    2.4 运行时间计算 2.4.1 一个简单的例子 2.4.2 一般法则 2.4.3 最大子序列和问题的求解 2.4.4 运行时间中的对数 2.4.5 检验你的分析 2.4.6 分析结果的准确性 小结 练习 参考文献第3章 表、栈和队列...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    2.4 运行时间计算 2.4.1 一个简单的例子 2.4.2 一般法则 2.4.3 最大子序列和问题的求解 2.4.4 运行时间中的对数 2.4.5 检验你的分析 2.4.6 分析结果的准确性 小结 练习 参考文献第3章 表、栈和队列...

    数据结构与算法分析_Java语言描述(第2版)

    2.4.3 最大子序列和问题的求解 2.4.4 运行时间中的对数 2.4.5 检验你的分析 2.4.6 分析结果的准确性 小结 练习 参考文献 第3章 表、栈和队列 3.1 抽象数据类型 3.2 表ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 ...

    数据结构与算法分析_Java语言描述(第2版)]

    算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的求解2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性小结练习参考文献...

    算法导论中文版

     4.1 最大子数组问题  4.2 矩阵乘法的Strassen算法  4.3 用代入法求解递归式  4.4 用递归树方法求解递归式  4.5 用主方法求解递归式  4.6 证明主定理  4.6.1 对b的幂证明主定理  4.6.2 向下取整和...

    数据结构与算法分析Java语言描述(第二版)

    算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的求解2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性小结练习参考文献...

    数据结构与算法分析 Java语言描述第2版

    算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的求解2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性小结练习参考文献...

Global site tag (gtag.js) - Google Analytics