《算法竞赛-训练指南》第一章-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 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;
}
第一、一维数组的最大连续和的求法。也是怪自己走私,看了好久也没有看怎么明白,不过最中还是明白了点,只让求的是最大连续和,没有让将这几个数求出来,分别是几,不过让的话,也是非常的简单的,只用存进数组就好了。
算法思想是这样的,最大连续和,当然是针对数组中有负数的情况,如果没有负数那谈不上求了,因为,最大的连续和肯定是整个数组的和。然后再说一下当全部是负数的情况下,求的的最大连续和是多少?其实应该是零的,因为最大连续子序列可以是个空集合,即不含任何的数组中的数,那么,此空集合的含义难道不是零么?仔细品味。
然后就是具体的算法了,既然是最大连续和,就肯定要抓住两个关键字,最大和连续,最大要求我们保证求得的结果是最大的,连续要求我们保证,你求得的一定是连续的数列和,那么就注意有这么个结论,那就是当你的和是负数的情况下,再加上一个数作为最大序列和,肯定是不正确的,也很明显,分两种情况,第一种是这个数是正数,那当然可得,当然是只要个整数来的大咯!如果是个负数,也不需要算了,因为你加上一个负数反而使的结果更小,显然这不是最优的结果,肯定要舍弃这个结果重新算。
这里我要插一些题外话,我太急功近利了,不知道自己需要的是什么,不知道自己想要过的生活是什么样子的,不知道自己的最终奋斗目标是什么,所以自己什么都做不好。有时候不知道怎么样生活,不知道什么样的生活方式才适合自己,所以我只能不断的读书,从书中读出我真正需要的是什么样的生活。我不知道给自己极大的压力,定一个非常难以达到的目标到底适不适合我,但是,我绝对不能虚度了我的青春年华绝对是正确的,不管我做的是什么样的事,定不能虚度光阴,因为你所讨厌的,厌恶的,及其恶心的今天,是多少人,希望用生命来换取的今天!
有时候是需要自省的,生活有计划,计划不落空,对生活充满激情,这才是正确的人生观。
贴出代码:
#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;
}
相关文章推荐
- 《算法竞赛-训练指南》第一章-1.24_pre二维矩阵中的最小连续矩阵和
- 《算法竞赛-训练指南》第一章-1.24-pre_二维矩阵求最小子矩阵(O(n^3))
- 《算法竞赛-训练指南》第一章-1.24-UVa 10755
- 《算法竞赛-训练指南》第一章-1.15_LA 3902
- 《算法竞赛-训练指南》第一章-1.21_LA2678
- 《算法竞赛-训练指南》第一章-1.28_UVa 10891
- 《算法竞赛-训练指南》第一章-1.25-LA 2965
- 《算法竞赛-训练指南》第一章-1.5_UVa 10881
- 《算法竞赛-训练指南》第一章-1.27-UVa 10635
- 《算法竞赛-训练指南》第一章-1.19_UVa 11549
- 《算法竞赛-训练指南》第二章-2.4-pre_Catalan
- 《算法竞赛-训练指南》第一章-1.9——UVa11210
- 《算法竞赛-训练指南》第一章-1.12_LA 3971
- 《算法竞赛-训练指南》第一章-1.26_LA 3882
- 《算法竞赛-训练指南》第一章-1.13_LA 3635
- 《算法竞赛-训练指南》第一章-1.7——UVa 11464
- 《算法竞赛-训练指南》-第一章-1.10_UVa 11384
- 《算法竞赛-训练指南》第一章-1.19_UVa 11549
- 《算法竞赛-训练指南》第一章-1.20_LA 3905
- 《算法竞赛-训练指南》第一章-1.4_LA 3708