题意:
n个数里面,找一段连续的数相加,输出其中的最大的和,并输出起点、终点
分析:
相加后大于该点的值,则加入当前连续段,更新该点为终点
相加后小于该店的值,则结束当前连续段,更新该点为起点、终点
核心:
dp[i] = max(a[i], dp[i-1]+a[i]);
代码:
#include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <math.h> #include <algorithm> #include <queue> #include <stack> #include <map> #include <vector> #include <time.h> using namespace std; int a[100000+10]; int main() { //freopen("a.txt", "r", stdin); int t, n, i, j, Case = 1; scanf("%d", &t); while(t--) { scanf("%d", &n); for(i = 1; i<=n; i++) { scanf("%d", &a[i]); } int begin=1, end=1, x=1, y=1; int sum = 0, ans = a[1]-1; for(i = 1; i<=n; i++) { if(sum + a[i] >= a[i]) { sum += a[i]; end = i; } else { sum = a[i]; begin = i; end = i; } if(ans < sum) { ans = sum; x = begin; y = end; } } if(Case>1)printf("\n"); printf("Case %d:\n", Case++); printf("%d %d %d\n", ans, x, y); } return 0; }