看到很多人用的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; } }