只需要从头开始遍历数组,用一个中间值记录目前的前缀和,如果前缀和大于零,那么说明后面的部分加上已有的的部分可能会出现更大的子数组和,如果前缀和小于零,那么说明后面的部分加上已有的部分会使整个和更小,所以将前缀和置0,从新开始计算,用数组存放中间过程的前缀和,找出最大值即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int dp[1005];
int num[1005];
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
//scanf("%d",&num[i]);
num[i]=pow(-1,rand())*rand();
for(int i=0;i<n-1;i++)
printf("%d ",num[i]);
printf("%d\n",num[n-1]);
int temp=0,maxx=-1;
dp[0]=max(num[0],0);
for(int i=1;i<n;i++)
{
temp=dp[i-1]+num[i];
if(temp<0)
dp[i]=0;
else
{
dp[i]=temp;
maxx=max(maxx,temp);
}
}
printf("%d\n",maxx);
}
return 0;
}