原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
分析:定义dp[i][1]表示到第i个数时的最大连续和,dp[i][1]表示dp[i][0]取到最大值时的左边起始位。
Max Sum
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #define maxn 100005 6 using namespace std; 7 int num[maxn],dp[maxn][2]; 8 int main() 9 { 10 int T,cas=1; 11 scanf("%d",&T); 12 while(T--) 13 { 14 int n; 15 scanf("%d",&n); 16 for(int i=0;i<n;i++) 17 scanf("%d",&num[i]); 18 dp[0][0]=num[0];dp[0][1]=0; 19 for(int i=1;i<n;i++) 20 { 21 if(dp[i-1][0]+num[i]>=num[i]){ 22 dp[i][0]=dp[i-1][0]+num[i]; 23 dp[i][1]=dp[i-1][1]; 24 } 25 else { 26 dp[i][0]=num[i]; 27 dp[i][1]=i; 28 } 29 } 30 printf("Case %d: ",cas++); 31 int mx=dp[0][0],l=0,r=0; 32 for(int i=1;i<n;i++) 33 { 34 if(dp[i][0]>mx) 35 { 36 mx=dp[i][0]; 37 l=dp[i][1]; 38 r=i; 39 } 40 } 41 printf("%d %d %d ",mx,l+1,r+1); 42 if(T)printf(" "); 43 } 44 return 0; 45 }