題意:
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; }