附上代码
#include<stdio.h>
long int a[200002];
long int dp[200002];//动归数组
int max(int x,int y){
return (x > y) ? x : y;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%ld",&a[i]);
long int maxi = a[1];//将最大值存为数组的第一个元素
if(n == 1)
{
printf("%d",max);
return 0;
}
dp[1] = a[1];//当只有第一个元素进行比较时,最大值为的一个元素本身
for(int i = 2;i <= n;i++)
{
dp[i] = max(dp[i - 1] + a[i],a[i]);
maxi = max(maxi,dp[i]);
}
printf("%ld",maxi);
return 0;
}
删除线格式
这道题是一道动态规划题目,也可以使用贪心算法来做,dp[i]的意思是到原数组的第i个元素时,最大子段和的值,再计算dp[i]时,需要比较dp[i-1] 和a[i]的大小,如果前者较大,就说明加上a[i]后最大子段和变大了,是我们想要的,如果加上a[i]后反而变小了,那前i个数的最大子段和就是a[i]本身。
maxi用来储存dp数组中最大的数,就是最后的答案。
上面说了这道题还可以用贪心算法解,
附上代码
#include<stdio.h>
long int a[200002];
long int sum;
int max(int x,int y){
return (x > y) ? x : y;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%ld",&a[i]);
long int maxi = a[1];//当i为1时,最大值,前i个的最大子段和都是a[1]
sum = a[1];
if(n == 1)
{
printf("%d",max);
return 0;
}
for(int i = 2;i <= n;i++)
{
sum += a[i];
if(maxi < sum)//判断是否更新maxi
maxi = sum;
else if(sum < 0)//如果sum的值小于零,那就把前面的全部不要,从零开始
sum = 0;
}
printf("%d",maxi);
return 0;
}
删除线格式
简单说一下,maxi永远保存的都是数列前i项的最大子段和的值,不一定是从头开始的,而是从前i项的任意位置开始,再任意位置结束,只是最大值。
这两段代码都是可以AC的。
删除线格式
溜了溜了~~