【題目】
給定k個整數的序列,其任意連續子串行可表示為,其中 1 <= i <= j <= k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大連續子串行和即為20。
【注】:為方便起見,如果所有整數均為負數,則最大子串行和為0。
解決這樣乙個問題是乙個很有趣的過程,我們可以嘗試著從複雜度比較高的演算法一步一步地推出複雜度較低的演算法。
時間複雜度:o(n^3)
int maxsubsequence(const
int a, int n)
if(thissum > maxsum)
maxsum = thissum;
} }
return maxsum;
}
時間複雜度 o(n^2)
int maxsubsequence(const
int a, int n)
} return maxsum;
}
時間複雜度:o(nlogn)
易知,對於一數字序列,其最大連續子串行和對應的子串行可能出現在三個地方。或是整個出現在輸入資料的前半部(左),或是整個出現在輸入資料的後半部(右),或是跨越輸入資料的中部從而佔據左右兩半部分。前兩種情況可以通過遞迴求解,第三種情況可以通過求出前半部分的最大和(包含前半部分的最後乙個元素)以及後半部分的最大和(包含後半部分的第乙個元素)而得到,然後將這兩個和加在一起即可。
int maxsubsequence(const
int a,int n)
static
int maxsubsum(const
int a, int left, int right)
center = (left + right)/2;
maxleftsum = maxsubsequence(a,left,center);
maxrightsum = maxsubsequence(a,center+1,right);
maxleftbordersum = 0;
leftbordersum = 0;
for(i = center;i >= left;i--)
maxrightbordersum = 0;
rightbordersum = 0;
for(i = center+1;i <= right;i++)
return max(maxleftsum,maxrightsum,maxleftbordersum + maxrightbordersum);
}
int max(int a, int b, int c)
【演算法四:動態規劃法】
時間複雜度:o(n)
int maxsubsequence(const
int a, int n)
return maxsum;
}
部落格內容**最大連續子串行和:動態規劃經典題目 動態規劃經典問題 最大連續子串行和
給出乙個整數序列s,其中有n個數,定義其中乙個非空連續子串行t中所有數的和為t的 序列和 對於s的所有非空連續子串行t,求最大的序列和。變數條件 n為正整數,n 1000000,結果序列和在範圍 263,263 1 以內。輸入描述 第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸出描述 輸...
動態規劃 最大連續子串行和
題目大意就是讓你選出一段和最大的連續序列,當有幾個序列和並列時,選出下標最小的的連續序列。可以採用動態規劃的思想解決,設一連續序列為a 0 a 1 a n 分別以a 0 a 1 a n 結尾的最大序列和為d 0 d 1 d n 若d i 1 0,則d i d i 1 a i 若d i 1 0,則d ...
動態規劃 最大連續子串行和
動態規劃 最大連續子串行和 問題描述 給定乙個數字序列a1,a2,an,求i,j 1 i j n 使得ai aj最大,輸出這個最大和。樣例 211 413 5 2顯然 11 4 13 20 為和最大的選取情況,因此最大和為20 下面介紹動態規劃的做法,複雜度為o n 讀者會發現其實左端點的列舉是沒有...