思路一:直接暴力,3个测试点超时,40分
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
#define ull unsigned long long
int main()
{
int n,a[200010];
cin >> n ;
int max=-12345;//max用来存答案
for(int i=0;i<n;i++)
{
cin >> a[i] ;
if(a[i]>max) max=a[i];//先让max=数组里面最大的数
}
for(int i=0;i<n;i++)
{
int s=a[i];
for(int j=i+1;j<n;j++)
{
s=s+a[j];
if(s>max) max=s;
}
}
cout << max << endl ;
return 0;
}
思路二:动态规划,转移方程为f[i]=max(f[i-1]+n[i],n[i]),但是f[n]的值并不一定是最终结果,所以,我们还要再用一个数从1到n再查找一次,才能找出结果
100分
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n[200001],p,ans[200001]={0};
int sum=-12345;
cin>>p;
for(int i=1;i<=p;i++)
{
cin>>n[i];
ans[i]=max(ans[i-1]+n[i],n[i]);
sum=max(sum,ans[i]);
}
cout<<sum;
return 0;
}
思路三:贪心,用一个s存放当前最大前缀和,一路累加,如果s变为了负数,那就重新赋值为0,因为加上一个负数,还不如不加。但是注意如果输入全为负数,需要特判一下,我是直接在输入的时候就存了一下数组元素的最大值
100分
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
#define ull unsigned long long
int main()
{
int n,a[200010];
cin >> n ;
int max=-12345;//max用来存答案
for(int i=0;i<n;i++)
{
cin >> a[i] ;
if(a[i]>max) max=a[i];//先让max=数组里面最大的数
}
int s=0;
for(int i=0;i<n;i++)
{
s=s>0?s:0;
s+=a[i];
max=max>s?max:s;
}
cout << max << endl ;
return 0;
}