链接:
https://www.nowcoder.com/questionTerminal/5a304c109a544aef9b583dce23f5f5db
来源:牛客网
链接:
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;
}
|
来源:牛客网
#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;
}