P1115 最大子段和 区间DP(简单易懂)

@题目链接
思路:
求最大区间和
数据范围 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;
}

猜你喜欢

转载自blog.csdn.net/zhimeng_LQ/article/details/105777805