原题:给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大;
不想说明什么,我们数据结构老师第一节课就给我们讲这个,以前给实现过一个暴力算法版的算法复杂度O(n2),现在实现一个动态规划版的;
/* *
* 求解最大子序列和问题O(n)算法;
* @param array
*/
public static void maxSubSum(int[] array){
// 只遍历一遍;
int curSum = 0; // 当前和;
int maxSum = 0; // 最大和;
int start = 0; // 起始;
int end = 0; // 终止;
int testStart = 0; // 测试的开始序列;
for(int i = 0; i < array.length; i++){
curSum += array[i];
if(curSum > maxSum){
start = testStart;
end = i;
maxSum = curSum;
}else if(curSum < 0){
testStart = i + 1;
curSum = 0;
}
}
System.out.println("最大自序列和是:"+maxSum);
System.out.println("start:" + start + ", end: " + end);
System.out.print("自序列是:");
for(int i = start; i <= end; i++){
System.out.print(array[i] + " ");
}
System.out.println();
}
其基本思想就是拥有最大自序列和的数组不可能是以负数开始的,所以如果当前和小于0,那么字数组必定向前推进1,而其他情况下不会改变最大和和起始终止位置。比起暴力版的这个好啊算法复杂度为O(n)。
<!--EndFragment-->
相关推荐
文件给出了四种方式求解子序列的最大和,并给出了具体的代码实现。对于深入探讨算法和程序性能非常有帮助。
求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列. http://blog.csdn.net/ssuchange/article/details/17341693
计算机算法分析与设计最大连续子序列 计算机算法分析与设计最大连续子序列是计算机...解决该问题需要使用动态规划法,读取输入数据,记录最大和和历史最大的和,并输出最大和、最大连续子序列的第一个和最后一个元素。
该算法遍历整个序列,保持两个变量:当前子序列的和(current_sum)和最大子序列和(max_sum)。如果当前元素大于current_sum加上当前元素,那么更新current_sum;否则,令current_sum等于当前元素。每次比较后,max...
“动态规划法求解最长公共子序列问题&0-1背包问题” 动态规划是一种非常重要的算法设计方法,应用于解决很多复杂的问题。动态规划法可以将问题分解成若干个小问题,然后通过解决每个小问题来解决整个问题。在实验2...
对于LCS问题,我们可以定义一个二维数组 `L[m+1][n+1]` 来存储子问题的解,其中 `L[i][j]` 表示 `X[1..i]` 和 `Y[1..j]` 的最长公共子序列的长度。 #### 四、具体步骤 1. **初始化**: - 当任一序列为空时,最长...
C语言C++实现蛮力法求最大子序列和,两种改进方案
最大子段和问题是一个经典的计算机科学问题,主要涉及算法设计和优化。动态规划是一种有效解决这类问题的方法,它通过构建一个最优子结构来避免重复计算,从而提高算法效率。在这个问题中,我们要在一系列整数中找到...
最长递增子序列(Longest Increasing Subsequence, LIS)问题是计算机科学中的一种经典动态规划问题,广泛应用于算法设计和分析。在给定的整数序列中,我们的目标是找到一个尽可能长的、不降序的子序列。这个子序列...
以求解最大子序列和问题为例,我们可以使用分治法将大数组分为两部分,分别求解子序列和,然后比较两个子序列和的最大值与原数组中的负数,取其中的最大值作为最终结果。 在比较蛮力法和分治法时,我们可以关注计算...
蛮力法是最直观的解法,通过遍历所有可能的子序列来找出最大和。对于长度为n的数组,我们需要检查n*(n+1)/2个子序列,时间复杂度为O(n^2)。这种方法虽然简单,但效率较低,当数据规模增大时,计算量会迅速增加。 2...
算法分析与设计最近对问题最大子段和(分治法最大子段和动态规划) 最近对问题最大子段和(分治法)是算法设计与分析中一个重要的知识点,它是指在一组点集中找到最近对点的距离。该问题可以通过分治法和动态规划来...
对于每一半,递归求解最大子序列和,并分别计算跨越中间位置的最大子序列和,最终取最大值作为结果。 ##### 4. 线性时间算法 使用动态规划思想,仅需一次遍历即可找到最大子序列和,时间复杂度为 \( O(N) \)。 ``...
其次,解决阶段,我们递归地对每个子序列执行相同的操作,即找出子序列的最大值和最小值。在最底层,子序列只有一个元素时,最大值和最小值就是这个元素本身。对于上述例子,{1, 5, 3, 9} 的最大值为 9,最小值为 1...
在算法领域,最长上升子序列(Longest Increasing Subsequence,LIS)问题是一个经典的问题,它在计算机科学中有着广泛的应用,例如在数据结构、排序算法以及动态规划等方面。本篇将详细介绍如何找出一个序列中长度...
动态规划是一种将大问题分解为小问题并存储子问题解决方案的技术,它在这里表现为求解最长递减子序列(LDS)来间接得到最长递增子序列(LIS)。这是因为对数列进行逆序处理,求解LDS就相当于求解原始数列的LIS。 ...
在论文中,作者还详细定义了子序列和公共子序列的相关概念,为算法的提出和证明打下基础。例如,一个字符串B如果是字符串A的子序列,则意味着B可以从A中通过删除一些元素(而不仅仅是重新排列这些元素)得到。...
实验5.4的主题是求解最大子序列和以及最大子矩阵的问题,这涉及到经典的动态规划算法。最大子序列和问题是一维数组中最长的连续子序列,使得子序列的和最大。最大子矩阵和问题是在二维矩阵中找到一个矩形区域,其...
1. 掌握动态规划法的设计思想并能熟练运用 2. 强化动手编程的能力 二. 实验内容 用动态规划法求两个序列的最大公共子序列 三. 算法思想 1. 分析可得如下动态规划函数: ① L[0][0]=L[i][0]=L...
本话题将深入探讨最大上升子序列和及其相关的算法。 首先,什么是最大上升子序列(Longest Increasing Subsequence,LIS)?在一个序列或数组中,最大上升子序列是指这样一个子序列:它的元素是原序列中的元素,...