瞬间求解最大连续和
来源:互联网 发布:行业大数据平台 编辑:程序博客网 时间:2024/06/06 01:02
已知一组整数数据 A1,A2,A3,A4,A5,A6.....AN ,并返回最大连续和。
先给出最极品的算法:
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>const int maxn=10000;int A[maxn],S[maxn];int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);#endifint n;scanf("%d",&n);int i;for(i=0;i<n;i++) scanf("%d",&A[i]);S[0]=A[0];//printf("S[0]=%d\n",S[0]);int best=A[0],tot=0;for(i=1;i<n;i++) //计算前缀和 {tot++;S[i]=S[i-1]+A[i];}int min_S=0;//保存当前遇到的最小S,当min_S=S[0]或其他的,都不对。 for(int j=1;j<n;j++){best>?=S[j]-min_S;//A[i]+……+A[j]=S[j]-S[i-1],当j确定时,减去之前遇到的最小s即可 min_S<?=S[j];//维护最小的s }printf("min_S=%d\n",min_S); printf("n=%d tot=%d\n",n,tot); printf("%d\n",best); return 0;}
剩下的由高效到低效排序如下:
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>const int maxn=10000;int A[maxn],tot;int maxsum(int *A,int x,int y)//在[x,y)左闭右开区间中求最大连续和 {if(y-x==1) return A[x];//没有这句不行,递归程序会一直运行下去。写递归函数,注意递归边界。 int m=x+(y-x)/2;//求靠近0的中点 int max=maxsum(A,x,m)>?maxsum(A,m,y);//求解子问题 int i,v,L,R;L=A[m-1];v=0;for(i=m-1;i>=x;i--) L>?= v+=A[i];//由划分处向左边求最大连续和 tot+=(m-x);// 记录加法操作数目 R=A[m];v=0;for(i=m;i<y;i++) R>?= v+=A[i];//由划分处向右边求最大连续和 tot+=(y-m);return max>?L+R;//合并问题 }int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);#endifint n;scanf("%d",&n);int i;for(i=0;i<n;i++) scanf("%d",&A[i]);tot=0;int best=maxsum(A,0,n);//直接调用求解[0,n)的最大连续和 printf("n=%d tot=%d\n",n,tot); printf("%d\n",best); return 0;}
O(n2):
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>const int maxn=10000;int A[maxn],S[maxn];int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);#endifint n;scanf("%d",&n);int i;for(i=0;i<n;i++) scanf("%d",&A[i]);S[0]=A[0];int best=A[0],tot=0;for(i=1;i<n;i++) {tot++;S[i]=S[i-1]+A[i];}for(i=0;i<n;i++) for(int j=i;j<n;j++) { tot++; best>?=S[j]-S[i-1]; } printf("n=%d tot=%d\n",n,tot); printf("%d\n",best); return 0;}
O(n*n*n):
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>const int maxn=30;int A[maxn];int main(){#ifndef ONLINE_JUDGE //freopen("in.txt","r",stdin);#endifint n;scanf("%d",&n);int i;for(i=0;i<n;i++) scanf("%d",&A[i]);int best=A[0],tot=0;for(i=0;i<n;i++) for(int j=i;j<n;j++) { int sum=0; for(int k=i;k<=j;k++) { sum+=A[k]; tot++; } best>?=sum; } printf("n=%d tot=%d\n",n,tot); printf("%d\n",best); printf("Time used=%.2lf\n",(double)clock()/CLOCKS_PER_SEC); return 0;}
- 瞬间求解最大连续和
- C#连续区间最大和求解
- 动态规划求解数组连续最大和
- 不同复杂度求解最大连续和
- 动态规划求解最大连续子序列和
- 如何求解最大连续子序列的和
- golang动态规划求解最大连续子数组和
- 连续子数组最大和或最大子段和的求解算法及其正确性
- 归纳法求解最大连续子序列
- 求解最大连续子数组的算法
- 求解最大连续子数组问题
- 编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
- ACMjava求解最大连续和的三种方法 暴力枚举,S前缀,回溯法
- 编程珠玑第八章——分治算法求解数组中的最大的连续和
- 【编程珠玑-读书笔记】算法设计技术—以求解"最大连续子序列和"为例
- HDU 2845 Beans (最大不连续子序列和)(压缩求解)
- 最大连续和
- 连续最大和
- Activity的onSaveInstanceState方法
- Eclipse快捷键大全
- SQL Server 孤立用户检测与处理
- Valgrind原理和检测S++插件内存泄漏的实例方法
- 用c语言读取固定大小的raw格式图像并统计灰度值
- 瞬间求解最大连续和
- 对于Webservices的超时问题
- Java中MDI的实现
- 伯克利DB
- Oracle 的NVL
- 第八周实验报告(一)《方案一》用类的重载运算符 +、-、*、/,使之能用于复数的加减乘除
- How to Sign Android APK or Zip Files
- MD5加密安全?
- Hibernate入门:第一个hibernate程序