任务描述
对于给定序列a1,a2,a3……an,寻找它的某个连续子段,使得其和最大。如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20。
相关知识
动态规划
输入格式
第一行输入一个n,代表有n个数
下面一行输入n个数,代表序列
0<n<100
序列中的数的范围为[-2000,2000]
输出格式
输出一个数,代表最大字段和。
输入
6 -2 11 -4 13 -5 -2
输出
20
分治法:
#include<stdio.h>
#include<math.h>
const int N =1e5+10;
int main()
{
int n;
scanf("%d",&n);
int a[N];
int max=0,s=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
s+=a[i];
if(s>max)
max=s;
if(s<0)
s=0;
}
printf("%d",max);
return 0;
}
动态规划法:
#include<stdio.h>
#include<math.h>
//const int N=5010;
int main()
{
int n,N=5010;
scanf("%d",&n);
int a[N],b[N];
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
int max=0;
for(int i=1;i<=n;i++)
{
if(b[i-1]>0) b[i]=b[i-1]+a[i];
else b[i]=fmax(b[i-1]+a[i],a[i]);
if(b[i]>max) max=b[i];
}
printf("%d",max);
return 0;
}