题目传送门
解题思路:
一道很简单的DP,首先统计前缀和,用f[i]表示到第i个元素可以获得的最大利润,用一个变量k来储存在i之前能获得最大连续利润的序列的首元素,所以就推出了:
f[i]=max(f[i],sum[i]-sum[k-1]);
关于k的更新: 当到了一个位置j,sum[j]-sum[k-1]<0时,就将k放入待定席,直到找到一个正数为止.
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 int n,sum[100001],f[100001],ans = -999999999,xb; 7 bool flag,vis; 8 9 int main() { 10 scanf("%d",&n); 11 for(int i = 1;i <= n; i++) { 12 scanf("%d",&f[i]); 13 sum[i] = f[i] + sum[i-1]; 14 f[i] = max(f[i],sum[i] - sum[xb-1]); 15 ans = max(ans,f[i]); 16 if(sum[i] - sum[xb-1] < 0) { 17 flag = 1; 18 xb = i; 19 } 20 if(flag == 1 && sum[i] - sum[xb-1] > 0) { 21 flag = 0; 22 xb = i; 23 } 24 } 25 printf("%d",ans); 26 return 0; 27 }