求一個(gè)序列的最大子序列之和!
不是求最大子序列之和嘛!我腦子居然就一直關(guān)注到了最大子序列上去了,
導(dǎo)致我想著實(shí)現(xiàn)代碼時(shí)、寫代碼時(shí)居然還去標(biāo)示它的位置,我真是傻??!
關(guān)鍵地方是之和對不對。只要我先找到此序列的一個(gè)最大值,然后從這個(gè)
最大值向兩邊擴(kuò)展就可以找到這個(gè)序列最大和。每次如何辨別擴(kuò)展的下一個(gè)數(shù)
是不是我要的數(shù)呢!當(dāng)然就是首先預(yù)先用sumcopy做一個(gè)當(dāng)前最大子序列和的一個(gè)副本。
每檢測下一個(gè)數(shù)r[i]時(shí),把它sumcopy+=r[i],是不是,只要sumcopy>sum。咋就
更新sum=sumcopy,把這個(gè)sumcopy作為最大子序列和。
這里我又有一個(gè)我思維缺陷的地方,我想的時(shí)候老是關(guān)注擴(kuò)展的下一個(gè)數(shù)是正數(shù)還是負(fù)數(shù),
真是笨啊,是不是。管它是正還是負(fù)。關(guān)鍵是最后能不能讓我變的更強(qiáng)大這才是最重要的
(一切以最大和為主)。為啥會這樣想呢,因?yàn)槿菀字镭?fù)的會讓序列變小,正的變大。
雖然我也想到了【當(dāng)前、負(fù)負(fù)負(fù)負(fù)負(fù)強(qiáng)強(qiáng)強(qiáng)負(fù)負(fù)】的情況(導(dǎo)致我去關(guān)注了正數(shù)的下標(biāo))。
其實(shí)咋不用管。不管正負(fù),咋先這個(gè)走過去,加到sumcopy里來。咋只到最后看最后的結(jié)果。
當(dāng)全部掃描到最后(最前一個(gè)、最后一個(gè))if(sumcopy>sum)sumcopy=sum。
這是我一個(gè)思維的誤區(qū)!好既然認(rèn)識到自己這個(gè)地方的思維缺陷,那我要從心里
殺死這個(gè)思維誤區(qū),和它說再見!
總結(jié):這個(gè)算法告訴我們。你選擇的人生道路可能會經(jīng)歷野火燒不盡的苦難。堅(jiān)持下去到最后,
你可能依舊還是很慘_,有時(shí)候得知道糾正回頭。但也有可能經(jīng)歷許多痛苦后
你會收獲很大,讓你遠(yuǎn)遠(yuǎn)強(qiáng)于今天的自己!
#include<iostream>
using namespace std;
void maxProportion(int arr[],int n){
int i=0,k=0,high=0,low=0,maxsum=0,maxsumcopy=0;
for(i=1;i<n;i++){
if(arr[i]>arr[k]){
k=i;
}
}
maxsumcopy=maxsum=arr[k];
high=k+1;low=k-1;
while(high<n){
maxsumcopy+=arr[high];
if(maxsumcopy>maxsum){
maxsum=maxsumcopy;
}
++high;
}
maxsumcopy=maxsum;
while(low>=0){
maxsumcopy+=arr[low];
if(maxsumcopy>maxsum){
maxsum=maxsumcopy;
}
--low;
}
cout<<maxsum<<endl;
}
int main()
{
int n,i;
//cout<<"你想輸入幾個(gè)數(shù)?";
cin>>n;
int arr[n];
//cout<<"輸入"<<n<<"個(gè)數(shù):";
for(i=0;i<n;i++){
cin>>arr[i];
}
// int n=6;
// int arr[]={-2,11,-4,13,-5,-2};
maxProportion(arr,n);
return 0;
}