看到很多人用的DP,其实这个题目可以贪心。贪心的思路非常简单,我们看到不太合适(t ≤ 0)的时候,我们不如直接放弃前面的成果,重新开始(t = 0)。然后我们的ans就实时用来保存最大的成果即可。

这里需要注意的事情是,我们需要优先处理,可能最后注定是亏本买卖的情况,这里我就直接求解出最大值就好,如果最大值小于0,那必然亏本(尽量少亏一点就行~)

#include <climits>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// 可以dp,也可以贪心
int main() {
    int n;
    while (cin >> n) {
        vector<int> f(n);
        long long ans = INT_MIN, t = 0;
        for (int i = 0; i < n; i++) {
            cin >> f[i];
        }
        ans = *max_element(f.begin(), f.end());
        if (ans >= 0) {
            for (int i = 0; i < n; i++) {
                t += f[i];
                if (t <= 0) t = 0;
                ans = max(ans, t);
            }
        }
        cout << ans << endl;
    }
}