Max Sum(杭电OJ1003)解题报告

来源:互联网 发布:pc屏幕同步软件 编辑:程序博客网 时间:2024/06/16 03:40

 

Max Sum

 

Problem Description
Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.
 

 

Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).
 

 

Output
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.
 

 

Sample Input
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
 

 

Sample Output
Case 1: 14 1 4 Case 2: 7 1 6
解题思路刚开始用最笨的方法试了一下,暴力搜索,全部走一边,时间花太多
了,超时了,对此改进了搜索的方式,只要两个循环就搞定了,时间加快了,但是相
对于来说还不是最快的,还是会超时的,一个个向后面走,只要和大于Max的,就记
录的,代码如下:
Code:
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     int n;  
  6.     cin>>n;  
  7.     int point1,point2;  
  8.     int step=1;  
  9.     while(n)  
  10.     {  
  11.         int max=-99999;  
  12.         int m,data[100000];  
  13.         cin>>m;  
  14.         for(int i=1;i<=m;i++)  
  15.             cin>>data[i];  
  16.         for(i=1;i<=m;i++)  
  17.         {  
  18.             int sum=0;  
  19.             for(int j=i;j<m;j++)  
  20.             {  
  21.                 sum+=data[j];  
  22.                 if(sum>max)  
  23.                 {  
  24.                     max=sum;  
  25.                     point1=i;  
  26.                     point2=j;  
  27.                 }  
  28.             }  
  29.         }  
  30.         if(step!=1)  
  31.            cout<<endl;  
  32.         cout<<"Case "<<step<<":"<<endl;  
  33.         cout<<max<<" "<<point1<<" "<<point2<<endl;  
  34.         step++;  
  35.         n--;  
  36.     }  
  37.     return 0;  
  38. }  
交上去还是超时的,最近用到动态规划,对算法进行改进了,起始点还是从头开始的,
一直到后面搜索,一直和为小于零,起始点就从开始小于零的后一位开始并把sum改为
零,再搜索的过程中,一遇到大的数据就记录下来,把其计为起始点和终点的,这里
面主要考虑到,当你搜索到一个位置的,它的和不小于零的,那对于后面来说,加上
去还是会变大的,不会给变小的,所以要再搜索下去的,走一边就KO了。代码如下:
Code:
  1. #include<iostream>  
  2. using namespace std;  
  3. #define Min -999999  
  4. int main()  
  5. {  
  6.     int data[100000],start,end;  
  7.     int m;  
  8.     int step=1;  
  9.     cin>>m;      
  10.     while(m--)  
  11.     {  
  12.         int n;  
  13.         cin>>n;  
  14.         for (int i=1; i<=n;i++)  
  15.             cin>>data[i];  
  16.         int max = Min;  
  17.         int k=1;  
  18.         int sum = 0;  
  19.         for (i=1; i<=n; i++)  
  20.         {  
  21.             sum = sum + data[i];  
  22.             if (sum > max)  
  23.             {  
  24.                 max = sum;  
  25.                 start=k;  
  26.                 end=i;  
  27.             }  
  28.             if(sum<0)  
  29.             {  
  30.                 sum=0;  
  31.                 k=i+1;  
  32.             }  
  33.         }  
  34.         if(step!=1)  
  35.             cout<<endl;  
  36.         cout<<"Case "<<step<<":"<<endl;  
  37.         cout<<max<<" "<<start<<" "<<end<<endl;  
  38.         step++;  
  39.     }  
  40.     return 0;  
  41. }  
 
原创粉丝点击