练习4.1-5最大子数组线性算法及证明
2016-02-10 10:12
387 查看
/* * max.c * * Created on: Feb 10, 2016 * Author: wing */ #include<stdio.h> #include<stdlib.h> int main(void) { int n,i,*num,cursum=0,maxsum=0,l=0,r; scanf("%d",&n); num=(int *)malloc(sizeof(int)*n); for (i=0;i<n;i++) { scanf("%d",&num[i]); cursum+=num[i]; if (maxsum<cursum) { maxsum=cursum; r=i; } if (cursum<0) { cursum=0; l=i+1; } } printf("%d,%d,%d",maxsum,l,r); return 0; }
假设算法扫描到j,cursum表示某一个i(num[i]>=0)到j的数组元素和,maxsum表示num[0..j]的最大子数组;
假设num[0..j]的和<0,而num[0..j-1]>=0,那么我们可以知道num[0,n-1]的最大子数组要么在num[0,j]里面,要么在num[j+1,n-1]里面,应为任意的k<j,num[0..k]的和>=0,即num[k+1..j]的和<0,因此最大子数组不可能横跨两个部分,依次类推即可
相关文章推荐
- 一些面试题目
- How Uuencoding Works
- html5在线画板
- hihocoder之01背包
- 教程Roll-a-ball tutorialMoving the Player 解读
- HTML+CSS笔记 CSS中级 一些小技巧
- c#之剪刀石头布
- c#之剪刀石头布
- HDU 4169 UVALive 5741 Wealthy Family
- c#之剪刀石头布
- UI控件(UISlider)
- 1018. 锤子剪刀布
- Java 多线程
- 细数JDK里的设计模式(转)
- 1017. A除以B
- Longest Increasing Path in a Matrix
- linux给普通用户添加root权限
- 【一拳超人】不可思议的英雄
- 大数据IMF-L38-MapReduce内幕解密听课笔记及总结
- [Python for Data Analysis] Python Basic--Function