最大子段和

来源:互联网 发布:魔兽世界7.0数据库 编辑:程序博客网 时间:2024/05/16 12:00
/* 再给顶的n个数的数组中选出连续的若干个数,使得他们的和是最大的,即最大连续自序列和. 列如. 序列. 1 -2 3 -1 6 -5 9 结果 当取子序列 3,-1,6,-5,9 结果12 我的思路. 1.最大连续子序列的开头是在1...n之中.的最大连续和 2.求出以i,开头的最大连续和,此时开头已经确定了,那麽通过枚举结尾j[i,j]之间记录最大连续的i->j的和max[i] 3.在所有以i开头的连续最大和中求出最大的一个即可. */#include <stdio.h>#define maxn 100int get_max(int a,int b){        return a>b?a:b;}int main(){        int max[maxn]={0},A[maxn];        int i,n;        for(scanf("%d",&n),i=1;i<=n;i++) scanf("%d",&A[i]);        for(i=1;i<=n;i++){                int sum=0,j;                for(j=i;j<=n;j++){                        sum+=A[j];                        max[i]=get_max(max[i],sum);                }        }        for(i=1;i<=n;i++) n=get_max(n,max[i]);        printf("%d \n",n);        return 0;}
/* * *问题:给出n个数子,求出其中连续的最大和从i,j 的和是 a[i]+a[i+1]+.......a[j] * *这是经典的动态规划题目 *问题:是求n个数字的其中的连续n个最大数的和. *最大连续的数字和的结尾一定是1...n中的一个. *因此我们只需要求出这样的d[i](以a[i]为结尾的最大连续和),d[i]的的出现可能是 *1.d[i-1]+a[i],(将a[i],放到i-1为结尾的位置,的后面). *2.以a[i]开头,且以a[i],结尾 *我们要在上面两者求出一个较大的.做为以a[i]为结尾最大的连续子序列之和(在这里a[],序列的子序列包含本身) *将以任意元素作为结尾的连续子序列何求出来后,在其中选出一个最大的. *序列的开头为什么不用判断呢,这是因为隐含到了d[i]中(即在得到d[i]是已经作出了选择即为上述的1,2过程) */#include <stdio.h>#define maxn 1001int main(){        int A[maxn]={0};        int d[maxn]={0},i,n,max=-0xffffff;        scanf("%d",&n);        for(i=1;i<=n;i++){                scanf("%d",&A[i]);                d[i]=A[i];                if(i>1) d[i]=d[i]>d[i-1]+d[i]?d[i]:d[i-1]+d[i];                if(max<d[i]) max=d[i];        }        printf("%d\n",max);        return 0;}


0 0
原创粉丝点击