标签:高效算法
题意:有n个数字围成一个圈,然后从圆圈拿走连续的一些数,问拿走的数的和的最大值是多少。
题解:普通最大连续和的做法,如果前面累加的数加当前数是大于最大值就更新最大值,如果小于0就把累加值清零,这个是有环的,那么可以从两种情况考虑,一种是普通的最大连续和找到的最大值,另一种就是头尾拼接的,把所有数取相反数,然后找到最大连续和,那么用总和sum加这个数就是头尾拼接的最大值,取两种情况较大的就是解。
#include <stdio.h> #include <algorithm> using namespace std; const int N = 200010; int n, s[N]; int main() { int t; scanf("%d", &t); while (t--) { scanf("%d", &n); int sum = 0; for (int i = 1; i <= n; i++) { scanf("%d", &s[i]); sum += s[i]; } int res = 0, maxx = 0; for (int i = 1; i <= n; i++) { res += s[i]; if (res > maxx) maxx = res; if (res < 0) res = 0; } for (int i = 1; i <= n; i++) s[i] = -1 * s[i]; int res2 = 0, maxx2 = 0; for (int i = 1; i <= n; i++) { res2 += s[i]; if (res2 > maxx2) maxx2 = res2; if (res2 < 0) res2 = 0; } printf("%d\n", max(maxx, sum + maxx2)); } return 0; }
标签:高效算法
原文地址:http://blog.csdn.net/hyczms/article/details/45066861