@题目链接
思路:
求最大区间和
数据范围 N<=200 000
number[maxn]记录输入数字 由于要求区间的累加值
设想只有两个数字的时候,读入第二个数字。
状态转移方程
f[i] = max(f[i-1] +number[i] , number[i]);
假设第一个数字是 7 则 f[i] = 7 此时sum=7;
第二个数字是-7 则 f[i] = 0 此时sum=7;
以此类推
每次查看新增数字后的连续字段和,是否大于历史最大值sum
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 200002;
int n;
int number[maxn];
int f[maxn];
int main()
{
int sum = -1e9;
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%d",&number[i]);
f[i] = max(f[i-1]+number[i],number[i]); //DP
sum = max(sum,f[i]);
}
cout<<sum<<endl;
return 0;
}