//一个简单地DP搞定//核心:(动态转移方程)d[i]=max(d[i],d[i-1]+d[i]);
代码:
#include<stdio.h> #include<algorithm> using namespace std; #define N 100005 int a[N]; int b[N]; int main() { int x; scanf("%d",&x); int k=1; int cnt=x; while(x--) { int n; scanf("%d",&n); int i; for(i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } for(i=2;i<=n;i++) { b[i]=max(b[i],b[i-1]+b[i]); } int MAX=b[1]; int end=1,star=1; for(i=1;i<=n;i++) { if(b[i]>MAX) { MAX=b[i]; end=i; } } int sum=0; for(i=end;i>=1;i--) { sum+=a[i]; if(sum==MAX) { star=i; break; } } if(k==cnt) { printf("Case %d:\n%d %d %d",k,MAX,star,end); } else { printf("Case %d:\n%d %d %d\n",k,MAX,star,end); } k++; printf("\n"); } return 0; }