免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
51 [报告]
发表于 2005-11-22 21:51 |只看该作者
顶起来。有朋友要。找得好苦。

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
52 [报告]
发表于 2005-11-22 23:16 |只看该作者

在《数据结构与算法 -- C语言描述》(Mark Allen Weiss 著)中有这道题的最佳算法

这也是我的算法:)只不过条件有点不一样,当所有值都小于0时返回0,
稍微改一下既可。
在第2章 算法分析
2.4.3 节中
这是源代码
int MaxSubsequenceSum(const int A[] , int N)
{
    int ThisSum, MaxSum, j;
   
    ThisSum = MaxSum = 0;
    for ( j=0; j<n ; j++)
    {
        ThisSum += A[j];

        if (ThisSum> MaxSum)
            MaxSum = ThisSum;
        else if (ThisSum < 0)
            ThisSum = 0;
    }
    returnh MaxSum;
}

大家如果对算法有兴趣的话不防看看这本书。

[ 本帖最后由 wxycyel 于 2005-11-22 23:30 编辑 ]

论坛徽章:
0
53 [报告]
发表于 2005-11-23 08:58 |只看该作者
楼上的看书能不能仔细点?
那本书上给出的算法是
  1. int

  2. max_subsequence_sum( int a[], unsigned int n )

  3. {

  4. int this_sum, max_sum, best_i, best_j, i, j;



  5. /*1*/       i = this_sum = max_sum = 0; best_i = best_j = -1;

  6. /*2*/       for( j=0; j<n; j++ )

  7. {

  8. /*3*/            this_sum += a[j];

  9. /*4*/            if( this_sum > max_sum )

  10. {       /* update max_sum, best_i, best_j */

  11. /*5*/                 max_sum = this_sum;

  12. /*6*/                 best_i = i;

  13. /*7*/                 best_j = j;

  14. }

  15. else

  16. /*8*/            if( this_sum < 0 )

  17. {

  18. /*9*/                i = j + 1;

  19. /*10*/               this_sum = 0;

  20. }

  21. }

  22. /*11*/      return( max_sum );

  23. }
复制代码

和之前yuxh的是一样的,而你的程序完全是两码事

论坛徽章:
0
54 [报告]
发表于 2005-11-23 10:07 |只看该作者
这个题目说起来有点罗嗦的:

我们尝试从某个 i 开始寻找最大串,
(+ x_i), (+ x_i x_{i+1}) , ...., (+ x_i, ...x_{j-1}) 均非负,但 (+ x_i ... x_j) <0

则 从 x_{j+1} 开始搜索可能的最大串。

此时我们跳过了 x_{i+1}, ..., x{j} ,这是因为

[1] x_{i}... x_{i+l}...x_{j-k}...x_{j}
(+ x_{i+l} ... x_{j-k}) <= (+ x_i ... x_{j-k}) <= 当前 MAX

[2] x_{i}...x_{i+l}....x_{j}....x_{j+k}....
(+ x_{i+l}... x_{j}) <= (+ x_i ... x_{j}) < 0  所以
      (+ x_{i+l}...x_{j+k}) < (+ x_{j+1}....x{j+k})

[1] 说明 x_i ... x_j 之间的串都不如当前找到的大,[2] 说明起始于 x_i, x_j 之间,终结于 x_j 之后的串都不可能是最大串,即使它比当前的 MAX 要大,但从 x_{j+1} 起始的串中有更大的。

[ 本帖最后由 win_hate 于 2005-11-23 10:09 编辑 ]

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
55 [报告]
发表于 2005-11-23 12:22 |只看该作者

你在哪个章节看到的?

原帖由 yzc2002 于 2005-11-23 08:58 发表
楼上的看书能不能仔细点?
那本书上给出的算法是
[code]int

max_subsequence_sum( int a[], unsigned int n )

{

int this_sum, max_sum, best_i, best_j, i, j;



/*1*/       i = this_sum = ma ...




如标题

论坛徽章:
0
56 [报告]
发表于 2005-11-23 17:39 |只看该作者
我的一个比较笨的方法

#include <stdio.h>

int pos1,pos2;
int find(int * array,int size)
{
        int i,j;
        int max=0,sum=0;
        for(i = 0; i<size;i++)
        {
                sum = 0;
                for(j=i;j<size;j++)
                {
                        sum += array[j];
                        if (sum > max)
                        {
                                max = sum;
                                pos1 = i;
                                pos2 = j;
                        }
                }
        }
        return max;
}
int main(int argc, char *argv[])
{
        int array[]={2, 3, -6, 3, 4, 3, -2, 5, 2, -3};
        int max;
        max = find(array,sizeof(array)/sizeof(int));
        printf("max=%d,pos1=%d,pos2=%dn",max,pos1,pos2);
       
        return 0;
}

论坛徽章:
0
57 [报告]
发表于 2005-11-23 19:57 |只看该作者
就是O(n)的动态规划吧。

f[n]=max{f[n-1]+a[n],a[n]}

a[n]为第n个元素
f[n]表示以第n个元素为结尾的子串能达到的最大值。

最大的f[n]就是要求的。

论坛徽章:
0
58 [报告]
发表于 2005-11-24 15:04 |只看该作者
O(N^2)的算法就算了吧,前面不久不是有位兄台贴了O(N)的算法了吗?

原帖由 yaomingwei_ren 于 2005-11-23 17:39 发表
我的一个比较笨的方法

#include <stdio.h>

int pos1,pos2;
int find(int * array,int size)
{
        int i,j;
        int max=0,sum=0;
        for(i = 0; i<size;i++)
        {
                sum = 0;
                for(j=i;j<size; ...

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
59 [报告]
发表于 2005-12-04 18:45 |只看该作者
我也来支持一下,受益匪浅啊

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

大家看看我这个对不对啊

#include <stdio.h>

#define MAX 9999
void MaxSum(int num[], int length)
{
        int begin, end, begin1;
        int blocksum, max;
        int i;

        max = -MAX;
        i=0;
        while(i < length)
        {
                begin1 = i;
                if(num[i] < 0)
                {
                        blocksum = num[i];
                        if(max < blocksum)
                        {
                                max = blocksum;
                                begin = begin1;
                                end = i;
                        }
                        i++;
                }
                else
                {
                        blocksum = num[i];
                        i++;
                        if(max < blocksum)
                        {
                                max = blocksum;
                                begin = begin1;
                                end = i;
                        }
                        while(blocksum >= 0 && i < length)
                        {
                                blocksum += num[i];
                                if(max < blocksum)
                                {
                                        max = blocksum;
                                        begin = begin1;
                                        end = i;
                                }
                                i++;
                        }
                }
        }

        printf("begin %d, end %d, max %d \n", begin, end, max);
}

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

        MaxSum(num, 10);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP