博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大连续和
阅读量:5043 次
发布时间:2019-06-12

本文共 1592 字,大约阅读时间需要 5 分钟。

给出一个长度为n的序列A1,A2,A3,...An,求最大连续和。换句话说,要求找到1=<i=<j=<n,使得Ai+...+Aj尽量大。

 

题目似乎很简单,但是在n非常大的时候(如n>10000)时,采用最习惯使用的暴力过的话似乎就有一些难度,

下面逐步给出了几种方法,解决问题在可以解出来时,应该找求最优解

 

方法一:枚举

直接在i到j之间一一枚举。复杂度O(n^3)

1 #include
2 int main() 3 { 4 int a[1000],n; 5 while(scanf("%d",&n)!=EOF) 6 { 7 int i; 8 for(i=0;i

方法二:处理后枚举

连续子序列的和等于两个前缀和之差。复杂度O(n^2)

1 #include
2 int main() 3 { 4 int n,a[1000],s[1000]; 5 while(~scanf("%d",&n)) 6 { 7 int i,j; 8 for(i=0;i
(s[j+1]-s[i])?best:(s[j+1]-s[i]);16 printf("%d\n",best);17 }18 return 0;19 }

方法三:分治法

划分问题:把问题实例划分为子问题

递归求解:递归解决子问题

合并问题:合并子问题的解得到原问题的解

复杂度O(nlogn)

1 #include
2 int maxsum(int *a,int x,int y)//返回数组左闭右开区间[x,y)中最大连续和 3 { 4 int i,m,v,L,R,max; 5 if(y-x==1)return a[x];//只有一个元素,直接返回 6 m=x+(y-x)/2;//分治第一步,划分为[x,m)与[m,y)两部分 7 int l=maxsum(a,x,m);//分治第二步,递归求解 8 int r=maxsum(a,m,y); 9 max=l>r?l:r;10 v=0;L=a[m-1];//第三步,合并子问题11 for(i=m-1;i>=x;i--){v+=a[i];L=L>v?L:v;}12 v=0;R=a[m];13 for(i=m;i
v?R:v;}14 return max>(L+R)?max:(L+R);//把子问题与L和R比较15 }16 int main()17 {18 int a[1000],n;19 while(~scanf("%d",&n))20 {21 int i;22 for(i=0;i

方法四:稍作处理

把O(n^2)的代码稍作处理,得到复杂度O(n)的算法

1 #include
2 int main() 3 { 4 int n,a[1000],s[1000]; 5 while(~scanf("%d",&n)) 6 { 7 int i; 8 for(i=0;i
s[i]?maxs:s[i];16 mins=mins

 

转载于:https://www.cnblogs.com/gj-Acit/archive/2013/02/12/2910332.html

你可能感兴趣的文章
Spring Boot使用Druid和监控配置
查看>>
poi 处理空单元格
查看>>
Android 内存泄漏优化总结
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>
Codeforces Round #374 (Div. 2)
查看>>
oracle数据类型
查看>>
socket
查看>>
Vue中使用key的作用
查看>>
二叉索引树 树状数组
查看>>
日志框架--(一)基础篇
查看>>
Java设计模式之原型模式
查看>>
Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子
查看>>
哲理故事与管理之道(20)-用危机激励下属
查看>>
关于源程序到可运行程序的过程
查看>>
wepy的使用
查看>>
Maven中的SnapShot版本和Release版本
查看>>
淘宝技术发展
查看>>
am335x ar8031 双网口配置记录
查看>>