题意:
给你一段序列,求最大连续子序列和
思路:
之前练过但还是wa了好几发,后来看了别人的代码才知道题目要求区间尽量大,我一看题目熟悉就只看样例敲了。这题有很多方法可解(详见水果君的六种姿势拿下连续子序列最大和问题http://blog.youkuaiyun.com/hcbbt/article/details/10454947),还有很多变形,
最大子矩阵和,最大子长方体等
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20005;
int arr[N];
int main() {
int cas, Case = 0;
scanf("%d", &cas);
while (cas--) {
int n;
scanf("%d", &n);
for (int i = 1; i < n; i++)
scanf("%d", &arr[i]);
int sum = arr[1], maxn = arr[1];
int left=1, right=1, l = 1;
for (int i = 2; i < n; i++) {
if (sum < 0 ) {
sum = 0;
l = i;
}
sum += arr[i];
if (maxn < sum ||( maxn==sum &&i-l>right-left)) {//注意!题目要求的区间要尽可能大。
maxn = sum;
left = l;
right = i;
}
}
if (maxn <= 0)
printf("Route %d has no nice parts\n", ++Case);
else
printf("The nicest part of route %d is between stops %d and %d\n", ++Case, left, right+1);
}
}