以前做过这道题目,那是还不懂状态方程。乱搞一气:
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=5000+10; 5 int a[maxn]; 6 int main() 7 { 8 int T; 9 scanf("%d",&T); 10 for(int i=1;i<=T;i++) 11 { 12 int n; 13 scanf("%d",&n); 14 for(int j=0;j<n;j++) 15 scanf("%d",&a[j]); 16 int maxd=a[0]; 17 int temp=a[0]; 18 int left=0; 19 int right=0; 20 int x=0; 21 for(int j=1;j<n;j++) 22 { 23 if(temp+a[j]<a[j]) 24 { 25 // left=right=j;//刚开始这里错了,不能直接转过去,先存到x中 26 temp=a[j]; 27 x=j; 28 } 29 else 30 temp+=a[j]; 31 if(temp>maxd) 32 { 33 maxd=temp; 34 left=x; 35 right=j; 36 } 37 } 38 printf("Case %d: ",i); 39 printf("%d %d %d ",maxd,left+1,right+1); 40 if(i!=T); 41 printf(" "); 42 } 43 }
后来的做法:
1 //状态方程:dp[j]=max(dp[j-1]+a[j],a[j]); 2 //dp[0]=a[0]; 3 #include <iostream> 4 using namespace std; 5 int dp[100001]; 6 int a[100001]; 7 int re_start[100001]; 8 int main() 9 { 10 int i,t; 11 cin>>t; 12 for(i=1;i<=t;i++) 13 { 14 int n,j; 15 cin>>n; 16 for(j=0;j<n;j++) 17 cin>>a[j]; 18 dp[0]=a[0]; 19 re_start[0]=0; 20 for(j=1;j<n;j++) 21 { 22 if(dp[j-1]+a[j]>=a[j]) 23 { 24 dp[j]=dp[j-1]+a[j]; 25 re_start[j]=re_start[j-1]; 26 } 27 else 28 { 29 dp[j]=a[j]; 30 re_start[j]=j; 31 } 32 } 33 int d=dp[0]; 34 for(j=0;j<n;j++) 35 if(dp[j]>d) 36 d=dp[j]; 37 printf("Case %d: ",i); 38 for(j=0;j<n;j++) 39 if(d==dp[j]) 40 { 41 printf("%d %d %d ",d,re_start[j]+1,j+1); 42 break; 43 } 44 if(i!=t) 45 printf(" "); 46 } 47 return 0; 48 }