《算法竞赛-训练指南》第一章-1.24_pre-一维数组最大连续和

来源:互联网 发布:mac下安装nodejs 编辑:程序博客网 时间:2024/06/11 05:30

这道题目我研究了一个上午,也是怪自己以前没有弄懂这个类型的题目,所以猛然上手,得弄懂很多的知识点。


第一、一维数组的最大连续和的求法。也是怪自己走私,看了好久也没有看怎么明白,不过最中还是明白了点,只让求的是最大连续和,没有让将这几个数求出来,分别是几,不过让的话,也是非常的简单的,只用存进数组就好了。

算法思想是这样的,最大连续和,当然是针对数组中有负数的情况,如果没有负数那谈不上求了,因为,最大的连续和肯定是整个数组的和。然后再说一下当全部是负数的情况下,求的的最大连续和是多少?其实应该是零的,因为最大连续子序列可以是个空集合,即不含任何的数组中的数,那么,此空集合的含义难道不是零么?仔细品味。

然后就是具体的算法了,既然是最大连续和,就肯定要抓住两个关键字,最大和连续,最大要求我们保证求得的结果是最大的,连续要求我们保证,你求得的一定是连续的数列和,那么就注意有这么个结论,那就是当你的和是负数的情况下,再加上一个数作为最大序列和,肯定是不正确的,也很明显,分两种情况,第一种是这个数是正数,那当然可得,当然是只要个整数来的大咯!如果是个负数,也不需要算了,因为你加上一个负数反而使的结果更小,显然这不是最优的结果,肯定要舍弃这个结果重新算。


这里我要插一些题外话,我太急功近利了,不知道自己需要的是什么,不知道自己想要过的生活是什么样子的,不知道自己的最终奋斗目标是什么,所以自己什么都做不好。有时候不知道怎么样生活,不知道什么样的生活方式才适合自己,所以我只能不断的读书,从书中读出我真正需要的是什么样的生活。我不知道给自己极大的压力,定一个非常难以达到的目标到底适不适合我,但是,我绝对不能虚度了我的青春年华绝对是正确的,不管我做的是什么样的事,定不能虚度光阴,因为你所讨厌的,厌恶的,及其恶心的今天,是多少人,希望用生命来换取的今天!

有时候是需要自省的,生活有计划,计划不落空,对生活充满激情,这才是正确的人生观。

贴出代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <string>using namespace std;const int MAXN = 100;int A[MAXN]; int maxSum(int n, int *B){int ans = 0;int sum = B[0];for (int i = 1; i < n; i++){if (sum > 0){sum += B[i];}else{sum = B[i];}if (sum > ans){ans = sum;}}return ans;}int main(){int N;while (scanf("%d", &N) != EOF){for (int i = 0; i < N; i++){scanf("%d", &A[i]);}int ans = maxSum(N, A);printf("%d\n", ans);}system("pause");return 0;}



觉得还是把贪心思想的代码贴过来吧;

#include <stdio.h>#include <string.h>#include <iostream>#include <string>using namespace std;const int MAXN = 100;int N;int A[MAXN];int S[MAXN];int main(){while (scanf("%d", &N) != EOF){for (int i = 1; i <= N; i++){scanf("%d", &A[i]);}S[0] = 0;for (int i = 1; i <= N; i++){S[i] = S[i - 1] + A[i];}int ans = 0;int MIN = 0;for (int i = 1; i <= N; i++){ans = max(ans, S[i] - MIN);MIN = min(MIN, S[i]);}printf("%d\n", ans);}system("pause");return 0;}