思路:s[i]记录以i结尾的最大字串和。如果 s[i-1]<=0,则以i结尾的当前最大字串和应该从a[i]开始;若 s[i-1]>0,则 s[i]= s[i-1]+a[i].为什么是这样呢,好好想想应该能清楚。 #include<iostream> using namespace std; #include<cstdio> int main() { int a[100005]; int sum[100005]; int num,n,i; while(scanf("%d",&n)!=EOF) { num=-1<<30; for(i=1;i<=n;i++) { scanf("%d",a+i); if(a[i]>num) num=a[i]; } if(num<=0) { printf("%d/n",num); continue; } num=sum[1]=a[1]; for(i=2;i<=n;i++) { if(sum[i-1]<=0) sum[i]=a[i]; else sum[i]=sum[i-1]+a[i]; if(num<sum[i]) num=sum[i]; } printf("%d/n",num); } return 0; }