码迷,mamicode.com
首页 > 编程语言 > 详细

返回一个首尾相连的整数数组中最大子数组的和数

时间:2018-11-04 17:07:39      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:数组   amp   数组元素   代码   部分   9.png   学习   技术分享   std   

设计思路:
只要找到从A[0]开始和最大的一段(A[0]…..A[j])(0 <= j < n)
以及以A[n-1]结尾的和最大的一段(A[i]…..A[n-1])(0 <= i < n)
该种情况的最大值为A[i]+…..+A[n-1]+A[0]+….+A[j]
如果i <= j 则最大值为A[0]+…..+A[n-1](数组元素全为正则返回0)否则最大值为A[i]+…..+A[n-1]+A[0]+….+A[j]
最后,取两种情况的最大值就可以了

通俗来说就是先从数组的第一位找到最后一位求出最大的子数组的和,然后再从最后一位向前找和是最大的值再加上第一位向后的所有正数。


#include<stdio.h> #include<iostream> using namespace std; int a[100010]; int main() { int n; while(scanf("%d",&n)!=-1) { int w=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); w+=a[i]; } int sum=0,sum1=a[0]; for(int i=0;i<n;i++) { if(sum>=0) { sum+=a[i]; } if(sum<0) { sum=0; } if(sum>sum1) { sum1=sum; } } int sum2=0,sum3=a[0]; for(int i=0;i<n;i++) { if(sum2<=0) { sum2+=a[i]; } if(sum2>0) { sum2=0; } if(sum2<sum3) { sum3=sum2; } } printf("%d\n",max(sum1,w-sum3)); } }

 实验总结:

        和上课时候讲的一样,找到思路是关键,思路找到之后剩下的代码都是比较好写的了,通过这几次课的练习我在思路方面比以前有了很大的进步,

以前不会写的程序和看不懂的程序,现在已经能理解一部分了,我相信通过以后的学习我会越来越好的。

 

程序截图:

技术分享图片

结对:id 雷焱(*宇)

技术分享图片

 

返回一个首尾相连的整数数组中最大子数组的和数

标签:数组   amp   数组元素   代码   部分   9.png   学习   技术分享   std   

原文地址:https://www.cnblogs.com/av-7845/p/9904345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!