标题:最大子段问题 分治实现错误
只看楼主
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
 问题点数:0 回复次数:5 
最大子段问题 分治实现错误
#include<iostream.h>
int MaxSubSum(int a[],int left,int right);
int MaxSum(int n,int a[]);
int main()
{
int a[]={-2,11,-4,13,-5,-2};
int s=MaxSum(6,a);
cout<<s<<endl;
return 0;
}
int MaxSubSum(int a[],int left,int right)
{
int sum=0;
if(left==right)sum=a[align=left]>0?a[align=left]:0;
else
{
int center=(left+right)/2;
int leftsum=MaxSubSum(a,left,center);
int rightsum=MaxSubSum(a,center+1,right);
int s1=0;
int lefts=0;
for(int i=center;i>=left;i--)
{
lefts+=a[i];
if(lefts>s1)s1=lefts;
}
int s2=0;
int rights=0;
for(i=center+1;i<=rights;i++)
{
rights+=a[i];
if(rights>s2)s2=rights;
}
sum=s1+s2;
if(sum<leftsum)sum=leftsum;
if(sum<rightsum)sum=rightsum;
}
return sum;
}
int MaxSum(int n,int a[])
{
return MaxSubSum(a,1,n);
}
按书上算法写了下,没出现错误,输出不对,应该是20
最近经常实现一些算法,又翻出了数据结构书,感觉数据结构的实现对我来说还是有难度,真在努力中,希望高手给点建议
对大家的无私帮助表示衷心的感谢
搜索更多相关主题的帖子: 大子 int 分治 MaxSubSum center 
2007-10-21 21:28
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
得分:0 

最大子段和的动态规划解法比分治法简单,又好实现多了


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2007-10-21 22:25
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
的确DP解法好多了.

倚天照海花无数,流水高山心自知。
2007-10-22 10:29
jxnuwy04
Rank: 2
等 级:新手上路
威 望:4
帖 子:768
专家分:0
注 册:2006-9-15
得分:0 
既然编译运行都正常,就是结果不对,那就是逻辑上出了问题了,应该单步调试一下。

------------------不为别的,就为你,我的理想!-----------------
2007-10-22 12:20
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
得分:0 

动态规划算法已经实现了,算法很简单
这算法我只是实现下,练习下
单步调试,vc我不会,又不象matlab


上善若水,水善利万物而不争,处众人之所恶
2007-10-22 16:32
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
得分:0 

#include <iostream.h>
#include <stdlib.h>

int MaxSubSum(int a[], int left, int right);
int MaxSum(int n, int a[]);
int main()
{
int a[] = {-2, 11, -4, 13, -5, -2};
int s = MaxSum(6 ,a);
cout << s << endl;
system("pause");
return 0;
}
int MaxSubSum(int a[], int left, int right)
{
int sum = 0;
if(left == right)
sum = a[align=left] > 0 ? a[align=left] : 0;
else {
int center = (left + right) / 2;
int leftsum = MaxSubSum(a, left, center);
int rightsum = MaxSubSum(a, center + 1, right);
int s1 = 0;
int lefts = 0;
for( int i = center; i >= left; i-- ) {
lefts += a[i];
if(lefts > s1) s1 = lefts;
}
int s2 = 0;
int rights = 0;
for(i = center + 1; i <= right; i++) {
rights += a[i];
if(rights > s2) s2 = rights;
}
sum = s1 + s2;
if(sum < leftsum) sum = leftsum;
if(sum < rightsum)sum = rightsum;
}
return sum;
}
int MaxSum(int n, int a[])
{
return MaxSubSum(a, 0, n - 1);
}
搞定


上善若水,水善利万物而不争,处众人之所恶
2007-10-22 23:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-179643-1-1.html




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

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