免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: whpu000625
打印 上一主题 下一主题

求一个数组中最大的相邻元素之和 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2005-12-16 23:45 |只看该作者

程序说明

每次从左开始搜索子块,直到子块的部分和blocksum为负时,子块的计算结束;如果当前数组元素为负,子块的部分和为该数组元素值。
if(max < blocksum)
{
        max = blocksum;
        begin = begin1;
        end = i;
}
用来计算最大部分和,并且纪录起始与终止位置

论坛徽章:
0
62 [报告]
发表于 2005-12-17 00:03 |只看该作者
晕,这不就是求最大子序列的问题吗?每本算法书上都有介绍的,不过论坛上有些高手确实说得比书上清楚

论坛徽章:
0
63 [报告]
发表于 2006-03-21 19:51 |只看该作者

这里的高手实在是太多了,我都热血沸腾了.
好有冲动,我也要好好学习,天天向上.争取在大家的帮助下,达到一定的境界!!!
努力奋斗!!
加油

论坛徽章:
0
64 [报告]
发表于 2006-03-22 09:42 |只看该作者
定义一个max[N]数组,max[0]=0;
然后进行求和比较,先是I=1单个较.将最大值放入max[1]
                           再是I=2,即两个相加的比较,将最大值放到max[2]
                  ...........
                                I=N                                            放到max[N]
最后,就是对数组max比较大小
即为结果了

我等一下写一下去好好写一下程序.

论坛徽章:
0
65 [报告]
发表于 2006-04-04 22:03 |只看该作者
顶楼上的一下,遇到这种问题,我最先想到的还是穷举……虽然笨了点,但是能解决问题

论坛徽章:
0
66 [报告]
发表于 2006-05-25 13:44 |只看该作者

回复 1楼 whpu000625 的帖子

int main(void)
{
  int m[10] = {2,3,-6,3,4,3,-2,5,2,-3};

int maxfar =0 ;
int maxend = 0 ;
int i ;

for(i = 0 ; i  < sizeof(m)/sizeof(int) , i++)
{
  maxend = max(maxend + m[i] , 0);
  maxfar   = max(maxend , maxfar);

}

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

exit(0)

}

论坛徽章:
0
67 [报告]
发表于 2006-05-25 13:45 |只看该作者

回复 66楼 leo_011094 的帖子

这个算法应该比较简单。

论坛徽章:
0
68 [报告]
发表于 2006-08-01 12:37 |只看该作者
刚看了关于动态规划的一些东西,我也写了一个。

  1. #include<cstdio>
  2. using namespace std;

  3. //O(n)
  4. int MaxSum(int n,int *a,int &start,int &end)
  5. {
  6.         int sum = 0,b = 0;
  7.        
  8.         for(int i = 0;i < n;i++){
  9.                 if(b > 0){
  10.                         b += a[i];
  11.                         end = i;
  12.                 }
  13.                 else{
  14.                         b = a[i];
  15.                         start = i;
  16.                 }

  17.                 if(b > sum)
  18.                         sum = b;
  19.         }

  20.         return sum;
  21. }

  22. int main()
  23. {       
  24.         int i,j,sum;
  25.         int m[10] = {2,3,-6,3,4,3,-2,5,2,-3};
  26.        
  27.         sum = MaxSum(9,m,i,j);
  28.         printf("The result is: %d\n",sum);
  29.         printf("The besti is %d, and the bestj is %d\n",i,j);
  30.         return 0;
  31. }
复制代码

论坛徽章:
0
69 [报告]
发表于 2006-08-01 14:26 |只看该作者
给一个解决的思路,第一遍扫描把连续正的和连续负的都加起来,这样一来得到的数组不是+-+-.... 就是 -+-+.... 形式的,根据例子得到的是 5, -6, 10, -2, 7, -3,然后从正数开始查找开始点和结束点,(如果都是负数,找个最小的负数就是了),如果前面(包括自己)的总和小于后一个负数的绝对值,那么从这个数开始肯定不正确(那么这个点是一个断点),同理找后面的,如刚才的例子, 5是一个断点,另一组的开始点是10,结束点是7,然后剩下的几组比较一下就可以了

论坛徽章:
0
70 [报告]
发表于 2006-08-02 08:46 |只看该作者
//需要O(n)的空间和O(n)的时间,只能解决最大和>0的情况
//动态规划
//b[j] = max{b[j-1]+a[j],a[j]}.1<=j<=n
//程序如下
int MaxSum(int n,int *a)
{
        int sum = 0;
        int b = 0;

        for(int i=1;i<=n;i++)
        {
                if(b>0)
                        b += a;
                else
                        b = a;
                if(b>sum)
                        sum = b;
        }
        return sum;
}

int main()
{
        int m[10] = {-2,-3,6,-3,4,-3,-2,-1,-2,-3};//MaxSum = 7
        int iRes;

        iRes = MaxSum(10,m);
        printf("%d\n",iRes);                                          //check the answer
        return 0;
}

[ 本帖最后由 masm32 于 2006-8-2 09:00 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP