原题:给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大;
不想说明什么,我们数据结构老师第一节课就给我们讲这个,以前给实现过一个暴力算法版的算法复杂度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
2.采用分治法求解最大连续子序列和问题 给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和。 例如: 序列(-2,11,-4,13,-5,-2)的最大子序列和为20序列; (-6,2,4,-7,5,3,2,-1,6,...
C语言C++实现蛮力法求最大子序列和,两种改进方案
最近对问题 最大子段和(分治法) 最长公共子序列问题 最大子段和(动态规划)
1. 掌握动态规划法的设计思想并能熟练运用 2. 强化动手编程的能力 二. 实验内容 用动态规划法求两个序列的最大公共子序列 三. 算法思想 1. 分析可得如下动态规划函数: ① L[0][0]=L[i][0]=L...
用分治法求解最大子序列问题。时间复杂度,O(NlogN) 环境:winXP + VC2008 输出: 《数据结构与算法分析 C++描述》p42最大子序列问题的递归方法代码 2010.09.07 vector a的内容: 4 -3 5 -2 -1 2 6 -2 最大子序列...
求最长公共子序列问题的一种快速算法,刘佳梅,,本文主要描述一种不同于动态规划法的一种新的求解最长公共子序列问题的方法,该算法主要是把求解公共字符串问题转化为求解矩阵L(p,m
蛮力法、分治法和动态规划法设计最大子段和问题的算法,一、试分别利用蛮力法、分治法和动态规划法求解最大子段和问题,要求写出C/C++程序实现和算法的效率分析。程序运行结果要同时给出最大子段和的值以及由哪个子段...
编程实现最大子段和问题的求解(分别采用分治法和动态规划法求解) 编程实现最长公共子序列(LCS)问题的求解 设计算法求解数字三角形问题,并编程实现。(P90算法实现题3-7)
最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,...
最长上升子序列(Longest Increasing Subsequence,简称 LIS)是一个经典的动态规划问题。给定一个无序的整数数组,找到其中最长上升子序列的长度。 上升子序列指的是一个子序列,它的每个元素都严格大于它前面的...
算法设计与分析中最大子段和问题的蛮力法、分治法和动态规划法
2. 将矩阵相邻两行对应列的元素相加形成一个新的序列,试分析该子序列中每-一个元素的含义,其最大子序列的含义。 3. 设计算法求解该问题,分析样例输入情况下算法的执行过程、主要变量的变化情况,并分析算法的...
给定一个字符串,求字符串中字典序最大的子序列.字典序最大的子序列是这样构造的:给定一个字符串 a0a1…an−1a_{0}a_{1}…a_{n-1}a0a1…an−1 ,首先在字符串中找到值最大的字符 aia_{i}ai,然后在剩余的字符串...
问题描述 ...给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB 则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA
用分治法求最大子段和,适合刚接触数据结构的初学者
利用动态规划的思想,以序列的每个点最为最右端,找出每个点作为最右端时的子序列长度的最大值,即问题的求解。因此,在计算前面的每个点的时候,将其结果保存下来,后面的点与前面的点的数值进行比较,如果大,则在...
最长公共子序列(LCS)算法 求两个字符串的最长公共子序列。...X的一个子序列是相应于X下标序列{1, 2, …, m}的一个子序列,求解两个序列的所有子序列中长度最大的,例如输入:pear, peach输出:pea。
给定一个无序的整数数组,找到其中最长上升子序列的长度。 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明:可能会有多种最长上升子序列的组合,你只需要输出...