/*
10 5 -3 12 -31 15 22 -7 6 -8 -9 10 ....
暴力:O(n^3)
分治:[ mid ) 三种情况求最大
基线法: O(n)
2个数组:
从左到本位:出现的最大累加
从左到本位:累加的最小值 网搜:最大连续和
*/ public class A
{
// 对a, [p,q) 区间求最大连续和
public static int g(int[] a, int p, int q)
{
if(q-p==1){
if(a[p]>0) return a[p];
return 0;
} int mid = (p+q)/2; int max = 0;
int m1 = g(a,p,mid);
if(m1>max) max = m1; int m2 = g(a,mid,q);
if(m2>max) max = m2; // 中间向左扩展搜索
int m3a=0;
int sum = 0;
for(int i=mid; i>=p; i--){
sum += a[i];
if(sum>m3a) m3a = sum;
} // 中间向右扩展搜索
int m3b=0;
sum = 0;
for(int i=mid+1; i<q; i++){
sum += a[i];
if(sum>m3b) m3b = sum;
} int m3 = m3a + m3b;
if(m3>max) max = m3; return max;
} public static int f(int[] a)
{
int max = 0;
for(int i=0; i<a.length; i++)
for(int j=i+1; j<a.length+1; j++){
int sum = 0;
for(int k=i; k<j; k++) sum += a[k];
if(sum > max) max = sum;
}
return max;
} public static void main(String[] args)
{
final int N = 2000; int[] a = new int[N]; for(int i=0; i<a.length; i++){
a[i] = (int)(Math.random() * 100) - 50;
} System.out.println(f(a));
System.out.println("-----------------------");
System.out.println(g(a,0,a.length));
}
}

最新文章

  1. Linux各个目录的作用及内容
  2. 开始VS 2012中LightSwitch系列的第5部分:我可以使用用户权限来控制访问权吗?
  3. [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
  4. 【BZOJ-1941】Hide and Seek KD-Tree
  5. robotframework笔记4
  6. POJ 3621Sightseeing Cows
  7. Android基础笔记(十四)- 内容提供者读取联系人
  8. JSP 和 Servlet 有哪些相同点和不同点, 他们之间的联系是什么?
  9. Groovy 设计模式 -- 组合模式
  10. C#使用CH341 SPI模块读写SD卡
  11. 【原创+整理】简述何为调用约定,函数导出名以及extern C
  12. C#如何使用REST接口读写数据
  13. 即时通讯(IV)
  14. Python if条件判断
  15. Failed to connect to /127.0.0.1:8080
  16. [剑指Offer]38-字符串的全排列
  17. Ubuntu中针对问题 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)的解决方案
  18. Django里自定义用户登陆及登陆后跳转到登陆前页面的实现
  19. Day Seven
  20. c++下为使用pimpl方法的类编写高效的swap函数

热门文章

  1. flink基础篇
  2. Spring整合Durid数据源
  3. 1025 PAT Ranking (25分) 思路分析 +满分代码
  4. vue打包 报错问题记录
  5. MySQL慢查询优化(线上案例调优)
  6. DPDK LPM库(学习笔记)
  7. 在IDEA中使用Spring写一个HelloWorld
  8. Web Scraper——轻量数据爬取利器
  9. 计算两点间的距离(hdu2001)
  10. yum CentOS7安装mysql