HDU 1003 Max Sum
经典DP
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF=0x7FFFFFFF; int T; int n; int a[100000+10]; int sum[100000+10]; int L[100000+10],R[100000+10]; int main() { scanf("%d",&T); int yu=1; int Yu=T; while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sum[1]=a[1]; L[1]=1;R[1]=1; for(int i=2;i<=n;i++) { if(sum[i-1]+a[i]>=a[i]) { sum[i]=sum[i-1]+a[i]; L[i]=L[i-1]; R[i]=i; } else { sum[i]=a[i]; L[i]=i; R[i]=i; } } int Max=-INF; for(int i=1;i<=n;i++) if(sum[i]>Max) Max=sum[i]; printf("Case %d:\n",yu); for(int i=1;i<=n;i++) if(sum[i]==Max) { printf("%d %d %d\n",Max,L[i],R[i]); break; } if(yu<Yu) printf("\n"); yu++; } return 0; }