求最大子序列的算法
2006-06-23 08:46
435 查看
问题:
给定一个序列,求它的一个连续子序列,使其值在所有子序列中最大,每个元素可以为负数。
分析:
用归纳法,当我们知道了(X1 X2… Xi-1)的最大序列后,那么加入Xi后会需要考虑两种情况:第一,原来的最大值不受影响;第二,包括Xi的后缀序列成了最大值,因此我们在遍历的过程中,需要保留这两个最大值。
[align=left]#include <stdio.h>[/align]
[align=left]#include <stdlib.h>[/align]
[align=left] [/align]
[align=left]double find_subserial(double x[],int n)[/align]
[align=left]{[/align]
[align=left] double global_max = 0; //save the global max value[/align]
[align=left] double suffix_max = 0; //save the suffix max value[/align]
[align=left] int i;[/align]
[align=left] for(i=0;i<n;i++)[/align]
[align=left] {[/align]
[align=left] if( suffix_max + x[i] > global_max)[/align]
[align=left] {[/align]
[align=left] global_max = suffix_max = suffix_max + x[i];[/align]
[align=left] }[/align]
[align=left] else if( suffix_max + x[i] > 0 )[/align]
[align=left] {[/align]
[align=left] suffix_max = suffix_max+x[i];[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] suffix_max = 0;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] return global_max;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc,char * argv[])[/align]
[align=left]{[/align]
[align=left] double * temp;[/align]
[align=left] int i;[/align]
[align=left] temp = (double *)malloc( (argc-1) * sizeof(double) );[/align]
[align=left] for(i=1;i<argc;i++)[/align]
[align=left] {[/align]
[align=left] temp[i-1] = atof(argv[i]);[/align]
[align=left] printf("%g ",temp[i-1]);[/align]
[align=left] }[/align]
[align=left] printf("/n");[/align]
[align=left] printf("The max is %g /n",find_subserial(temp,argc-1));[/align]
[align=left] return 0;[/align]
}
给定一个序列,求它的一个连续子序列,使其值在所有子序列中最大,每个元素可以为负数。
分析:
用归纳法,当我们知道了(X1 X2… Xi-1)的最大序列后,那么加入Xi后会需要考虑两种情况:第一,原来的最大值不受影响;第二,包括Xi的后缀序列成了最大值,因此我们在遍历的过程中,需要保留这两个最大值。
[align=left]#include <stdio.h>[/align]
[align=left]#include <stdlib.h>[/align]
[align=left] [/align]
[align=left]double find_subserial(double x[],int n)[/align]
[align=left]{[/align]
[align=left] double global_max = 0; //save the global max value[/align]
[align=left] double suffix_max = 0; //save the suffix max value[/align]
[align=left] int i;[/align]
[align=left] for(i=0;i<n;i++)[/align]
[align=left] {[/align]
[align=left] if( suffix_max + x[i] > global_max)[/align]
[align=left] {[/align]
[align=left] global_max = suffix_max = suffix_max + x[i];[/align]
[align=left] }[/align]
[align=left] else if( suffix_max + x[i] > 0 )[/align]
[align=left] {[/align]
[align=left] suffix_max = suffix_max+x[i];[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] suffix_max = 0;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] return global_max;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc,char * argv[])[/align]
[align=left]{[/align]
[align=left] double * temp;[/align]
[align=left] int i;[/align]
[align=left] temp = (double *)malloc( (argc-1) * sizeof(double) );[/align]
[align=left] for(i=1;i<argc;i++)[/align]
[align=left] {[/align]
[align=left] temp[i-1] = atof(argv[i]);[/align]
[align=left] printf("%g ",temp[i-1]);[/align]
[align=left] }[/align]
[align=left] printf("/n");[/align]
[align=left] printf("The max is %g /n",find_subserial(temp,argc-1));[/align]
[align=left] return 0;[/align]
}
相关文章推荐
- 算法学习——LSC最大公有子序列 java实现
- 最大子序列和的线性算法及其它算法
- 将算法复杂度一步步进化到O(n)的最大子序列和的方法合集
- 最大子序列算法
- 求序列中连续相邻元素之和最大值的四种算法
- [算法学习笔记]分治法——最大子序列和问题
- LCS 最大公共序列算法
- 【数据结构与算法】最大子序列和问题的求解
- 最大连续子序列和的O(n)算法
- 最大连续子序列之和算法进化历程
- LCS 最大公共序列算法
- 求解最大子序列和问题的线性时间算法
- 用Python 学习数据结构与算法 六、最大子序列
- Max Subsequence Sum 最大子序列和问题 O(NlogN)与O(N)算法的对比
- 【算法】—— 最大子序列和问题
- 数据结构和算法学习系列之最大子序列求和问题的O(N)时间复杂度
- 用O(nlogn)的算法实现最大上升子序列(LIS)输出.
- 算法(一):最大子序列和问题的多种求解(打印子序列)
- 经典算法——求最大子序列和
- 算法基础-例1:求有限整数序列中最大值的算法