题目描述
【理财有风险,投资需谨慎】
Alice计划将自己的所有红包拿去投资。
在粗略预测了该理财产品的各日收益后,Alice希望通过一次买卖获得最大的收益。
买卖当天均可以享受到当日盈亏,允许一天内先买后卖。
希望你帮她计算一下最大盈利。
输入
第一行是样例个数K(1<=K<=100)
每个样例的第一行是天数N(1<=N<=100)
第二行包含N个整数Ai(-100<=Ai<=100),表示当天盈亏。
输出
对于每个样例,输出一个数字表示Alice的最大盈利。
如果该理财产品赚不到钱,她也可以选择不购入此产品,请直接输出0。
样例输入
4
3
1 0 0
9
-2 1 -3 4 -1 2 1 -5 4
6
-4 -1 5 -4 1 -1
3
-9 -9 -6
样例输出
1
6
5
0
Code
【扎一点笔记】
- 子串是指数组中连续的若干个元素,而子序列只要求各元素的顺序与其在数组中一致,没有连续的要求。
思路:当加第i个数时,如果前面i-1个数的和小于0,那么再加第i个数那么得到的数会比第i个数还小,所以就重新开始考虑第i个数以后的数作为最大子串。(参考1)
#include <bits/stdc++.h>
using namespace std;
int ai[105];
int main(){
int k;
cin>>k;
while(k--){
int n;
cin>>n;
memset(ai,0,sizeof(ai));
for(int i=0;i<n;i++) cin>>ai[i];
int sum=ai[0];
int maxn=sum;
for(int i=1;i<n;i++){
if(sum>0) sum+=ai[i];
else sum=ai[i];
if(maxn<sum) maxn=sum;
}
if(maxn<=0) cout<<'0'<<endl;
else cout<<maxn<<endl;
}
return 0;
}