笔试题连续最大和

链接: https://www.nowcoder.com/questionTerminal/5a304c109a544aef9b583dce23f5f5db
来源:牛客网

思路是这样的:

首先把初始最大值定义为这个范围内的最小值,然后对数组中的没一项逐项求和,求和为cursum,如果当前都为正数,那么

就把cursum的值给maxsum,如果遇到较小的负数,就先把maxsum这个值先保留着,等到再遇到正数能把这个负数抵消,就再把这个cursum赋值给maxsum;如果遇到特别大的负数,把前面的cursum都拉成负值了,说明在这个扶植前面这些数全都失效了,cursum重新你定义为0,用来检验后续数组中是反扑有比maxsum大的数列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main(){
    int n,curSum=0,maxSum=-1e5;
    cin>>n;
    int arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
        curSum+=arr[i];
        if(curSum>maxSum){
            maxSum=curSum;
        }
        if(curSum<0){
            curSum=0;
        }
    }
    cout<<maxSum<<endl;
    return 0;
}
链接: https://www.nowcoder.com/questionTerminal/5a304c109a544aef9b583dce23f5f5db
来源:牛客网

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector< int > in(n);
    for ( int i=0;i<n;i++)
        cin>>in[i];
    vector< int > dp(n);
    dp[0]=in[0];
    int maxVal=in[0];
    for ( int i=1;i<n;i++)
    {
        dp[i]=max(in[i],dp[i-1]+in[i]);
        if (dp[i]>maxVal)
            maxVal=dp[i];
    }
    cout<<maxVal<<endl;
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_40086556/article/details/80024053