Max Sum
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 15 Accepted Submission(s) : 4
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最大自子序列和,没用用到动态规划的根本知识,单纯的累加判断而已,如果有大神到来请多指教,#include<iostream> using namespace std; int main() { int t,i,j,n,max,st,la,s,x,l; cin>>t; for(i=1;i<=t;i++) { cin>>n; max=-1001; s=0; l=0; for(j=1;j<=n;j++) { cin>>x; s+=x; l++; if(s>max) { max=s; la=j; st=j-l+1; } if(s<0) { l=0; //这地方改了下,就AC了。 s=0; } } cout<<"Case "<<i<<":"<<endl; cout<<max<<" "<<st<<" "<<la<<endl; if(i!=t) cout<<endl; } return 0; }动态规划实现的代码如下#include<iostream> #include <cstdio> #define N 100010 using namespace std; int a[N],b[N]; int main() { int t,n; scanf("%d",&t); int k=1; while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } b[1]=a[1]; for(int i=2;i<=n;i++) { if(b[i-1]<0) b[i]=a[i]; else b[i]=a[i]+b[i-1]; } int max=b[1]; int e=1; for(int i=2;i<=n;i++) { if(max<b[i]) { max=b[i]; e=i; } } int test=0; int f=e; for(int i=e;i>0;i--) { test+=a[i]; if(test==max) f=i; } cout<<"Case "<<k++<<":"<<endl<<max<<" "<<f<<" "<<e<<endl; if(t) cout<<endl; } return 0; }