2001:X额宝|最大子串和

题目描述

【理财有风险,投资需谨慎】
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值