您的位置:首页 > 其它

求最大子序列的算法

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]
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 ini