题目
解题思路
首先这是一个最大子序列问题,那读完题后我们发现需要两个变量来存放左和右两个下标,一个temp_sum表示临时最大值,一个sum表示最终最大值,因为最大值在处理的过程中会变得,需要用sum来保存新的最大值。
那么接下来我们需要知道如果当前读入数使得子序列最大值小于0了,即temp_sum<0,那么此时不管候面来什么值,都应该舍弃temp_sum<0前面的子序列,因为负数只会拉低总和不会,所以不要也罢,如果不懂我举个例子,子序列“1、2、3、-9、1”,当读到-6
的时候,你会发现sum的值是6,而temp_sum是-3,很明显不能更新sum的值对吧,因为6比-3大,所以直接放弃当前的temp_sum,让他等于0,同时更新temp_index,这个也很关键,如果后面有更大的数字,那么这个temp_index是要充当左端下标给left_point的。
实现代码
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable:4996)
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
cin>>n;
int left_point=0 , right_point=n-1 , temp_sum=0 , sum=-1 , temp_index=0;
vector v(n);
for(int i=0;i>v[i];
temp_sum=temp_sum+v[i];
if(temp_sum<0)
{
temp_sum=0;
temp_index=i+1;
}
else if(temp_sum>sum)
{
sum=temp_sum;
left_point=temp_index;
right_point=i;
}
}
if(sum<0) cout<<"0";
else
{
cout<
总结
本题是最大子序列的问题,是一个基础问题,因为他只要求输出最大值、最左边的值和最右边的值。遇到这种题目我们是在读输入的过程中就进行处理。
Comments | 2 comments
Blogger Trey
Hi I am so glad I found your website, I really found you by error, while I
was browsing on Yahoo for something else, Anyhow I am here now and would just like to say thanks a lot for a incredible post
and a all round entertaining blog (I also love the theme/design), I don’t have time to look over it all at the
minute but I have bookmarked it and also added your RSS feeds, so when I have time I will
be back to read a great deal more, Please do keep
up the excellent work.
Blogger Doretha Seppi
Your writing is convincing, it’s hard to look away.