| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2063 人关注过本帖
标题:分治法求最大序列和
取消只看楼主 加入收藏
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
结帖率:58.18%
收藏
 问题点数:0 回复次数:0 
分治法求最大序列和
程序老是运行不了,搞了好久才发现是DivideAndConquer(int Left,int Right,int Array[])里的Left,Right首字母没有大写。

这个递归很难将函数运行的过程写出来吧,假设DivideAndConquer函数是正确的接着写就好。我是这样理解这里的递归的,有其他看法的么?

DivideAndConquer函数是否可以放在求跨边界最大子列和后面,这个我试了一下,试了几组可以的,先求跨边界再求两边的方法本就是对的吧。
如果我要输出最大序列和的序列号是从哪到哪的怎么输出?这个我还没想,不会。


程序代码:
#include <stdio.h>

int Compare(int LeftMaxArray , int RightMaxArray , int MaxCrossBorderArray )
{
    int Max=LeftMaxArray;
    if( Max < RightMaxArray )
    { 
        Max = RightMaxArray;
    }

    if(Max < MaxCrossBorderArray )
    {
        Max = MaxCrossBorderArray;
    }

    return Max;
}


int DivideAndConquer(int Left,int Right,int Array[])
{
    int LeftMaxArray , RightMaxArray ;            //左右两边序列和最大值
    int LeftCrossBorderArray , RightCrossBorderArray ;  
    int LeftMaxCrossBorderArray , RightMaxCrossBorderArray , MaxCrossBorderArray ;  //跨边界序列和最大值
    int MaxArray;
    int i,Mid;

    if(Left==Right) //分治法求解的递归出口
    {
        if(Array[Left>0])    return Array[Left];
        else return 0;
    }

    //用分治法递归的求解左右两边子序列和最大值
    Mid=( Left + Right ) / 2;

    LeftMaxArray = DivideAndConquer(Left , Mid , Array);
    RightMaxArray = DivideAndConquer(Mid+1 , Right , Array);

    //求跨边界序列和最大值
    LeftMaxCrossBorderArray = -9999; RightMaxCrossBorderArray = -9999;
    LeftCrossBorderArray=0 ; RightCrossBorderArray=0 ;

    for(i=Mid ; i>=Left ; i--)   //从中间向左扫描
    {
        LeftCrossBorderArray+= Array[i] ;
        if( LeftCrossBorderArray > LeftMaxCrossBorderArray )
            LeftMaxCrossBorderArray = LeftCrossBorderArray ;
    }

    for(i=Mid+1 ; i<=Right ; i++)    //从中间向右扫描
    {
        RightCrossBorderArray+= Array[i] ;
        if( RightCrossBorderArray > RightMaxCrossBorderArray )
            RightMaxCrossBorderArray = RightCrossBorderArray ;
    }
    MaxCrossBorderArray = LeftMaxCrossBorderArray + RightMaxCrossBorderArray ;

    //比较左右两边序列最大和 与 跨边界序列最大和
    MaxArray=Compare( LeftMaxArray , RightMaxArray ,  MaxCrossBorderArray) ;

    return MaxArray;

}

int main()
{
    int Array[100000];
    int i,k;
    int MaxArray;

    scanf("%d",&k);

    for(i=0;i<k;i++)
        scanf("%d",&Array[i]);

    MaxArray = DivideAndConquer( 0 , k-1 , Array );

    printf("%d\n", MaxArray );

    return 0;

};
搜索更多相关主题的帖子: 字母 color 序列号 
2015-10-24 17:30
快速回复:分治法求最大序列和
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026953 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved