最大子段和(分治法)
2018-06-17 23:43:12来源:未知 阅读 ()
题目:输入n个数,求最大的连续子段和,并输出子段的起点下标和终点下标;
思路:分治法;
代码如下:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <map> #define N 1000005 using namespace std; int a[1005]; int calc(int s,int e,int &l,int &r) { int l1,l2,l3,r1,r2,r3; ///if(s==e) return a[s]>0?a[s]:0; if(s==e) { if(a[s]>0) { l=s; r=s; return a[s]; } else return 0; } int mid=(s+e)>>1; int sum1=calc(s,mid,l1,r1); int sum2=calc(mid+1,e,l2,r2); int sl=0,sr=0,t=0; for(int i=mid; i>=s; i--) { t+=a[i]; if(sl<t) sl=t,l3=i; } t=0; for(int i=mid+1; i<=e; i++) { t+=a[i]; if(sr<t) sr=t,r=i,r3=i; } int ss=sl+sr; l=l3,r=r3; if(ss<=sum1) ss=sum1,l=l1,r=r1; if(ss<=sum2) ss=sum2,l=l2,r=r2; return ss; } int main() { int n; while(1) { printf("输入数列长度:"); scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); int l=1,r=1; int sum=calc(1,n,l,r); if(sum>0) { cout<<"最大子段和:"<<sum<<endl; cout<<"起点和终点:"<<l<<" "<<r<<endl; } else { cout<<"最大子段和:"<<sum<<endl; cout<<"无起点和终点!"<<endl; } cout<<endl; } return 0; }
运行截图:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- P1358 扑克牌 2020-05-06
- 博弈--巴什博弈 2020-04-24
- Z 字形变换 2020-04-14
- [题记-并查集] 合根植物 - 蓝桥杯 2020-04-07
- 无法正确通过算法题目都是哪些原因造成的? 2020-04-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash