#include "stdio.h"
#include"stdlib.h"
#include"iostream"
#include <limits.h>
#include"vector"
using namespace std;
/*
求连续子数组最大和。--动态规划思想
假设dp[i]表示以数组A第i个元素结尾的连续子数组和最大
dp[0]=A[0]
dp[1]=max(A[1],A[1]+dp[0])
dp[2]=max(A[2],A[2]+dp[1])
dp[3]=max(A[3],A[3]+dp[2])
...
d[n-1]=max(A[n-1],A[n-1]+dp[n-2])
最后取max(dp[0],dp[1],...dp[n-1])即可
*/
int maxSubArray_DP(int* A, size_t szA,int &maxSum)//int &maxSum 这是一个引用,表示maxSum和main中的output同属执行一个地址的变量
{
vector<int> dp(szA);//用C++容器可实现变量指定容器大小
maxSum=INT_MIN;
int pos=0;
for(int i=0;i<szA;i++)//数组个数
{
if(i==0)
dp[0]=A[0];
else
dp[i]=max(A[i],A[i]+dp[i-1]);
//-------------------11111-------------方式1-------------
// msa = max(msa,r[i]);
//若以A[i]结尾的子数组更大,则更新最大子数组的值,并且记录结尾元素的位置i;
/* if(maxSum<dp[i])
{
maxSum = dp[i];
pos = i;
}*/
//-------------------------------------------------
}
//---------------------2222----------------方式2---------
for(int i=0;i<szA;i++){
if(dp[i]>maxSum){
maxSum=dp[i];
pos=i;
}
}
//-------------------------------------------------------------
return pos;
}
int main()
{
int N;
cin>>N;
int *A = new int[N];
for(int i=0;i<N;i++){
cin>>A[i];
}
int output=0;
maxSubArray_DP(A, N, output);
cout<<output;
return 0;
}