题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805514284679168

这题主要有两点

  1. 特判全为负数的情况漏了
  2. 可以使用start数组记录最开始的下标

代码

  1. #include<vector>
  2. #include<cstdio>
  3. using namespace std;
  4. const int maxn = 10010;
  5. vector<int> number(maxn, 0), dp(maxn), start(maxn);
  6. int main(){
  7. int n, max = 0;
  8. bool flag = false;
  9. scanf("%d", &n);
  10. for(int i = 0; i < n; i++) {
  11. scanf("%d", &number[i]);
  12. if(number[i] >= 0) flag = true;
  13. }
  14. if (flag == false){
  15. printf("0 %d %d", number[0], number[n - 1]);
  16. return 0;
  17. }
  18. dp[0] = number[0];
  19. for(int i = 1; i < n; i++){
  20. if(number[i] >= dp[i - 1] + number[i]){
  21. dp[i] = number[i];
  22. start[i] = i;
  23. } else {
  24. dp[i] = dp[i - 1] + number[i];
  25. start[i] = start[i - 1];
  26. }
  27. if(dp[i] > dp[max]) max = i;
  28. }
  29. printf("%d %d %d" ,dp[max], number[start[max]], number[max]);
  30. }