状态方程:sum[i]=max(sum[i-1]+a[i],a[i]);
找出动态转移方程就可以直接ac掉了.
#include<iostream> using namespace std; int main(void) { int n,i,flag,num[10000],temp,start,end; int sum,max; while(cin>>n,n) { flag=0; for(i=0;i<n;i++) { cin>>num[i]; if(num[i]>=0) { flag=1; } } if(flag==0) { cout<<'0'<<" "<<num[0]<<" "<<num[n-1]<<endl; continue; } start=0; temp=0; for(i=0,max=-1,sum=0;i<n;i++) { sum+=num[i]; if(sum>max) { start=temp; end=i; max=sum; } if(sum<0) { sum=0; temp=i+1; } } cout<<max<<" "<<num[start]<<" "<<num[end]<<endl; } return 0; } |