♣
求最大子段和的分治算法
假期在家研究算法,请问最大子段的分治算法如何实现?这里是我写的代码,但是不知道哪里出问题了
请大家帮我看看。。谢谢了
int max_sum(int a[], int left, int right)
{
if (left==right)
{
if (a[left]>0)
return a[left];
else return 0;
}
else
{
center=(left+right)/2;
leftsum=max_sum(a,left,center);
rightsum=max_sum(a,center+1,right);
}
s1=0;lefts=0;
for(int i=center;i>=left;i--)
{
lefts+=a[i]; //这里求左右两子段时,可能出现问题。怀疑是自己的思路
} //本身就是有问题的。
if(lefts>s1)
s1=lefts;
s2=rights=0;
for( int j=center+1;j<=right;j++)
{
rights+=a[j];
}
if(rights>s2)
s2=rights;
s=s2+s1;
if(s1==leftsum && s2==rightsum)
return s;
else
{
if(leftsum<rightsum)
return rightsum;
else
return leftsum;
}
}
· 网友精彩回答:
顶一下
要上班了,没有时间看代码了......................
分治算法复杂度o(nlogn),有o(n)的算法:
int maxsubseqencesum( 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 ;
}
return maxsum ;
}
下面是分治+递归的实现:
int maxsubsum( int a[], int left, int right )
{
int maxleftsum, maxrightsum ;
int maxleftbordersum, maxrightbordersum ;
int leftbordersum, rightbordersum ;
int center, i ;
if( left == right )
if( a[left] > 0 ) return a[left] ;
else return 0 ;
center = (left+right)/2 ;
maxleftsum = maxsubsum( a, left, center ) ;
maxrightsum = maxsubsum( a, center+1, right ) ;
maxleftbordersum = 0 ; leftbordersum = 0 ;
for( i = center; i >= left; --i ) {
leftbordersum += a[i] ;
if( leftbordersum > maxleftbordersum )
maxleftbordersum = leftbordersum ;
}
maxrightbordersum = 0 ; rightbordersum = 0 ;
for( i = center + 1 ; i <= right ; ++i ) {
rightbordersum += a[i] ;
if( rightbordersum > maxrightbordersum )
maxrightbordersum = rightbordersum;
}
return max3( maxleftsum, maxrightsum, maxleftbordersum+maxrightbordersum ) ;
}
- 更多问题:
- · 卢武铉告诉布什:“中国是在历史上侵略韩国多达数百次的国家,我们岂能忘记如此刻骨般痛苦的往事呢?”
- · 歌词“给你我所有”的上一句是什么?
- · 达赖喇嘛表示愿意有条件放弃“达赖”的头衔
- · 传巨浪二型导弹成功发射 具二次核打击能力
- · 请问各位,这个函数错在哪里?编译通过,运行错误。
- · 亚太板块变得越发脆弱 日本将遭受灭顶之灾
- · 请推荐一下关于tomcat的资源站点(中文)。
- · 博士街头当乞丐?
- · 标题有点那个,还是不写了吧
- · "\u4E66\u5199\u8BC4\u8BBA"是什么编码?怎么转换成汉字?
- · 如何在Eclipse中安装Swt designer?
- · 太郁闷了,上来发泄一下。
- · hibernate 中得子查询,怎么修改(多对一得关系)。请高手看看,谢谢!
- · ASP访问DBF和ACCESS的问题
- · 发布免费软件:Contact.Net V1.0 --个人关系管理,欢迎使用哈! --放分
- · 大家说一下换工作时,是先和新单位签合同,还是先和原单位提出离职的?是不是一般都是第一天上班才签合同的?
- · date函数应用
- · cstring类的应用 | cstring
- · mid与mid编码
- · 异步应用技术
- · DataGrid技术文档 | DataGrid
- · VBScript技术文档
- · ntfs文件
- · 入侵xp
- · 改mac
- · sql入侵
- · dns服务器设置
- · pdf word
- · java doc
- · borland c3.1的使用
- · 网站后门
- · ghost使用
- · 2001年5月那场轰动全球的中美黑客大战是什么回事?
- · 请问系统恢复软件哪款效果好?
- · 系统故障恢复控制台
- · 如何恢复xp系统管理员的管理权限
- · 一键ghost恢复系统
- · 一款类似Ghost的系统备份恢复软件ImageIt
- · 可以用U盘制作windowsxp系统恢复盘吗
- · 系统恢复方法
- · 浏览器

