概述:给出一段序列,求在这段序列中能求出的最大和,并且表示出这个和是从那里开始到哪里结束。
思路:最大序列和的问题。讲课时候讲过一道这样的题目,但是与那道题目不同的是,这道题要求把序列开始时数字的位置和结束时数字的位置写出,这个就要求在结束时选择的数字相等时就是结束的标志,然后倒着推回去,当数字相等时就是开始的位置。
思路:上午上课做的这道题,最开始落掉了位置这个。。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;
}