标签:
概述:给出一段序列,求在这段序列中能求出的最大和,并且表示出这个和是从那里开始到哪里结束。
思路:最大序列和的问题。讲课时候讲过一道这样的题目,但是与那道题目不同的是,这道题要求把序列开始时数字的位置和结束时数字的位置写出,这个就要求在结束时选择的数字相等时就是结束的标志,然后倒着推回去,当数字相等时就是开始的位置。
思路:上午上课做的这道题,最开始落掉了位置这个。。wa了,改掉之后又然后因为输出格式的原因,一直wa。。。最后不清楚自己代码出的问题,找到了一个代码提交过。
原代码:
#include<iostream> #include<fstream> using namespace std; int max(int a,int b) { if(a>b) return a; else return b; } int main() { ifstream cin("in.txt"); int T; int s,e,time=1; cin>>T; int N; int dp[100005]; int a[100005]; while(T--) { int temp=0; cin>>N; for(int i=1;i<=N;i++) cin>>a[i]; int sum=0; dp[1]=max(a[1],0); for(int i=2;i<=N;i++) dp[i]=max(dp[i-1]+a[i],0); for(int i=1;i<=N;i++) if(sum<dp[i]) { sum=dp[i]; e=i; } for(int i=e;i>0;i--) { temp+=a[i]; if(temp==sum) s=i; } cout<<"Case "<<time++<<":"<<endl; cout<<sum<<" "<<s<<" "<<e; if(T) cout<<endl<<endl; } return 0; }提交代码:
#include <iostream> #include<fstream> using namespace std; int get(int data[], int &l, int &r, int dl) { int max = -10000000; l = 0; r = 0; int t = 1; int mt = 0; for (int i = 0; i < dl; i++) { mt = mt + data[i]; if (mt > max) { max = mt; l = t; r = i + 1; } if (mt < 0) { mt = 0; t = i + 2; } } return max; } int main() { //ifstream cin("in.txt"); int T; cin >> T; for (int k = 1; k <= T;k++) { int n = 0; cin >> n ; int * data = new int[n]; for (int i = 0;i < n; i++) { cin >> data[i]; } int l = 0, r = n - 1; int max = 0; max = get(data, l, r, n); cout << "Case " << k << ":" << endl; cout << max << " " << l << " " << r << endl; if (k != T) cout << endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/qq_34269718/article/details/51348412