题目描述
给出一串长度为 n 的数列,要求从中找出连续的一段来使得总和最大。
输入格式
第一行包含一个整数 n(1≤n≤100000),表示数列的长度。
第二行包含 n 个整数来描述这个数列 a[i](i从1~n编号),每个整数的的绝对值不超过 1000。
输出格式
第一行输出一个整数,为最大的连续段总和。
第二行输出两个整数,分别表示最大的连续段的起始位置和终止位置。
样例数据 1
输入
5
1 -2 3 1 -4
输出
4
3 4
分析
网上一般都流传着4种做法,但真正有用的就是后面两种:分治和dp
我用的就是dp,这个dp基于贪心
定义dp[i]表示以a[i]结尾的最大连续和
代码
#include<bits/stdc++.h>
using namespace std;
const int N=100009;
int n,a[N],dp[N],sta[N],end[N];
int main(){
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;++i) scanf("%d",&a[i]);
int ans=-1000000000,qi=0,zho