`
yanguz123
  • 浏览: 568583 次
  • 性别: 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 请按任意键继续. . .

    最大子序列和问题的求解.md

    ### 最大子序列和问题详解 #### 一、引言 最大子序列和问题是一个经典的计算机科学问题,涉及在一串整数(其中可能包括负数)中找到具有最大和的连续子序列。此问题不仅在理论研究中有重要意义,在实际应用如生物...

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

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

    最大子序列求和最大子序列求和

    标题和描述均提到了“最大子序列求和”,这是一个经典的计算机科学问题,主要涉及寻找一个序列(通常是数组)中连续子序列的最大和。这个问题在多种领域都有应用,如数据分析、金融风险管理、生物信息学等。文章中...

    最大字段和问题 分治法.cpp.rar

    **最大字段和问题**,也被称为**最大子序列和问题**,是指在给定的一组数字中找到一个连续子序列(或子数组),使得这个子序列的和最大。这个问题在实际应用中非常常见,比如在金融数据分析中寻找收益最大的投资组合...

    分治法求最大子数组以及其对应的下标.rar_well4fw_分治法_分治法求下标

    这个问题是经典的计算机科学问题,也被称为“最大子序列和问题”(Maximum Subarray Problem),最早由著名计算机科学家Dijkstra提出。 解决这个问题的一个经典算法是 Kadane's Algorithm,但这里我们关注的是分治...

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

    最大子段和问题是指给定一个由 n 个整数(可能有负整数)组成的序列(a1, a2, …, an),求该序列中的最大子段和。 知识点: 1. Maximum Subarray Problem:最大子段和问题是指给定一个由 n 个整数(可能有负整数...

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

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

    西南交通大学-算法分析与设计-实验5.4实验报告包含预习部分-求最大子序列-求最大子矩阵

    最大子序列和问题是一维数组中最长的连续子序列,使得子序列的和最大。最大子矩阵和问题是在二维矩阵中找到一个矩形区域,其内部元素之和最大。 1. **最大子序列和算法**: 在动态规划方法中,我们通常使用Kadane'...

    最大子段和问题 蛮力法 分治法 动态规划法

    最大子段和问题是一个经典的...- 尝试解决变种问题,如寻找次大子段和,或者在有负数的情况下寻找最大绝对值子段和。 通过深入理解和实践这些算法,不仅可以提升编程能力,还能为解决更复杂的算法问题打下坚实的基础。

    dongtaiguihua.rar_算法分析与设计

    《算法分析与设计——探索序列最大子序列和问题》 在计算机科学中,算法分析与设计是核心领域,它涉及到如何高效地解决复杂问题。在这个主题下,我们常常会遇到各种经典的问题,其中之一就是求解给定序列的最大子...

    Java-Leetcode-最大子数的和.zip

    在这个“Java-Leetcode-最大子数的和.zip”压缩包中,我们可以看到它主要关注的是Java语言和LeetCode上的一个问题——找到数组中的最大连续子序列和。 这个问题是动态规划的经典例子,它被称为“最大子数组和”或...

    蓝桥杯c++-蓝桥杯竞赛练习之算法提高题和最大子序列.zip

    本资料包“蓝桥杯C++_蓝桥杯竞赛练习之算法提高题和最大子序列”旨在帮助参赛者深入理解和熟练运用C++解决实际问题,特别是针对算法优化和最大子序列求解等关键问题。 首先,我们要了解C++在算法竞赛中的重要性。...

    MaxSubseqSum.zip_MaxSubseqSum()

    这里我们关注的是“最大子序列和”问题,这是算法设计中的一个经典子问题,通常与动态规划或者分治策略相关联。给定一个整数序列,目标是找到一个连续子序列(可以是空),使得其元素之和最大,并返回这个最大和。 ...

    最长子列问题C语言实现

    本文介绍了如何使用C语言解决最大子序列和问题,包括问题的背景、核心概念、代码解析及优化思路。通过对这些知识点的学习,读者可以更好地理解并掌握此类问题的解决方法,为后续深入学习算法打下坚实的基础。

    max_batch.rar_batch

    这里我们关注的问题是寻找数组中和最大的子块,也称为“最大子序列和”问题。这是一个经典的动态规划问题,经常出现在算法设计和分析中。给定的标题“max_batch.rar_batch”暗示了这个任务可能与批量处理相关,可能...

    最大子段和问题实验报告.docx

    具体实现时,我们需要计算左半部分的最大子序列和`leftSum`,右半部分的最大子序列和`rightSum`,以及跨越分割点的最大子序列和`midSum`。最后,返回这三个最大值中的最大者。分治法的时间复杂度可以达到O(n log n)...

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

    在计算机科学领域,字符串处理是常见的任务之一,而求解字符串中字典序最大的子序列是一个有趣且具有挑战性的问题。字典序是用于比较字符串的一种方式,它按照字符的ASCII值顺序对字符串进行排序。在这个问题中,...

    lcs.rar_LCS

    在压缩包中的“06083115-郭康-最大子序列问题”可能是一个文件名,可能包含郭康(假设是作者)编写的代码或报告,详细解释了LCS问题的解决方法,并可能提供了执行示例,帮助读者直观地理解LCS算法的运行过程。...

    2.1动态规划最大子段和_动态规划求最大子段和_

    例如,对于数组`[-2, 1, -3, 4, -1, 2, 1, -5, 4]`,最大子序列和为`6`,对应的子序列是`[4, -1, 2, 1]`。 **动态规划思路**: 动态规划的核心在于将原问题分解为更小的子问题,并利用这些子问题的解来构建原问题的...

Global site tag (gtag.js) - Google Analytics