動態規劃 最大連續子序列
阿新 • • 發佈:2018-12-19
這個問題比較經典哈,就是一個數組內,求和最大的連續的子序列。
有一個題可以看看,
吶,我們比較暴力的方法就是無腦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; }