最大连续子序列之和
来源:互联网 发布:saas软件租用模式合同 编辑:程序博客网 时间:2024/05/19 01:30
穷举法思路:
1,-3,4,5最大子序列为4+5=9,
4 -2 3 5 最大子序列为4+-2+3+5 = 10
穷举数列的每个区间,将区间内的数相加,更新最大值,每计算一个区间后求和的sum要清0
代码:
#include <stdio.h>main(){int n,i,j,k,max,sum=0,a[100];scanf("%d",&n);for (i=0;i<n;i++){scanf("%d",&a[i]);}max=a[0];for (i=0;i<n;i++) { for (j=i;j<n;j++) { for (k=i;k<=j;k++)//k所在的范围是i和j之间元素 { sum+=a[k];//sum为i和j之间元素之和 } if (sum>max) //一个连续的区间元素之和sum大于max就说明找到比之前还要大的,就取代max { max=sum; } sum=0; //进入下次计算sum清0 } } printf("%d",max);}
非枚举思路:
当输入的数全为负数时则输出最大的那个负数(负数再加来加去就会变小)。
将序列按顺序加,只要sum不小于0,sum就一直加后面的元素,若sum>max后,就将sum值赋给max,若sum值不大于max则sum继续加后面的元素,
若sum加后面元素后为负数,则让sum再从a[i]开始重新加知道大于max替换掉
代码:
#include <stdio.h>main(){ int n,a[100],i,j=0,max=-1000000000,sum=0,flag=0;scanf("%d",&n);for (i=0;i<n;i++){scanf("%d",&a[i]); } for (i=0;i<n;i++) { if (a[i]>0) { flag=1; //数组不全是负数,则标记并退出 break; }else { if (max<a[i]) //假如是负数,则记录最大的负数 max=a[i]; } } if (flag) for (i=0;i<n;i++) { if (sum<0) sum=a[i]; //sum<0让a[i]的值取代sumelse sum+=a[i]; //求和if(sum>max) //sum只有大于之前的max值才能取代max max=sum; } printf("%d ",max);}
0 0
- 最大连续子序列之和
- 最大连续子序列之和
- 最大连续子序列之和
- 最大连续子序列之和
- 最大连续子序列之和
- 最大子连续序列之和
- 最大连续子序列之和
- 最大连续子序列之和,最大连续子序列乘积
- 计算最大连续子序列之和
- 输出最大连续子序列之和
- 最大连续子序列之和的问题
- 连续子序列之和
- 最大连续子序列之和(动态规划)
- 求最大连续子序列之和 立方算法
- 算法进化历程之“最大连续子序列之和”
- 算法之最大连续子序列之和之变形题目
- 最大连续子序列之和 动态规划 java
- 最大连续子序列之和算法进化历程
- WebView setSupportMultipleWindows与onCreatWindow
- Hive查询总结
- ZCMU-1345-国际象棋
- JavaScript-Array & Array like
- 机房重构七层之登录
- 最大连续子序列之和
- BZOJ 3224 Tyvj 1728 普通平衡树 (Treap)
- bzoj 3110 K大数查询 整体二分
- setupwizard重新设置
- 《C++ Primer Plus(第六版)》(39)(第十七章 输入、输出和文件 笔记2)
- GPGSV 格式分析及错误分析 (2013-02-20 14:55:35)
- adapter 报错
- 83. Remove Duplicates from Sorted List
- 数据结构-Hash法-静态Hash法