您的位置:首页 > 其它

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

2013-08-03 14:56 337 查看
这道题目我研究了一个上午,也是怪自己以前没有弄懂这个类型的题目,所以猛然上手,得弄懂很多的知识点。

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

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

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

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

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

贴出代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: