1. 程式人生 > >動態規劃 最大連續子序列

動態規劃 最大連續子序列

這個問題比較經典哈,就是一個數組內,求和最大的連續的子序列。

有一個題可以看看,

吶,我們比較暴力的方法就是無腦for。

這種方法是O(n^3)

#include <iostream> 
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
int main(){
	int a[]={-2,1,-3, 4,-1,2 ,1,-5,4};
	int maxx=-0x3f3f3f3f;
	int len=sizeof(a)/4;
    //sequential subarray 起點的for
	for(int i=0;i<len;i++) {
        //sequential subarray 終點的for
		for(int j=i;j<len;j++){
            //計算subarray的值
			int sum=0;
			for(int k=i;k<=j;k++){
				sum+=a[k];
			}
			maxx=max(maxx,sum);
		}
	}
	cout<<maxx<<endl;
}

顯然我們是不用這種方法的。

有一個比較tricky的地方是,

   和是負數的子序列一定不是結果子序列的字首序列。

為了解釋清楚我們想一下就好。

我們在遍歷這個陣列的時候,如果這個元素前面 連續子序列的和 是負數,不管這個元素是正數還是負數,我這個元素本身就比前面的連續子序列的和大啊,幹嘛要和前面相加,自己做新的子序列的頭就可以了。

#include <iostream> 
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
int main(){
	int a[]={-2,1,-3,4,-1,2,1,-5,4};
	int res=INT_MIN;
    //sum就是字首序列的和
	int sum=0;
	for(int i=0;i<9;i++){		
        //如果字首<0那麼就從新的元素開始
		if(sum<0) sum=0;
		sum+=a[i];
        res=max(sum,res);
	}
	cout<<res<<endl;
}