求數(shù)組的子數(shù)組之和的最大值

問題:一個有N個整數(shù)元素的一維數(shù)組(A[0],A[1],...,A[n-2],A[n-1]),這個數(shù)組有很多子數(shù)組(連續(xù)的幾個數(shù)),那么子數(shù)組之和的最大值是什么呢?

據(jù)說微軟曾用這道題難倒很多學(xué)生,本文從《編程之美》中記錄了一種速度比較快的解法。

分析:可以考慮數(shù)組的第一個元素A[0],假設(shè)已經(jīng)知道(A[1],...,A[n-1])中和最大的一段數(shù)組之和為All[1],并且已經(jīng)知道(A[1],...,A[n-1])中包含A[1]的和最大的一段數(shù)組為Start[1],那么,(A[0],...,A[n-1])中問題的解All[0]是就是max{A[0],A[0]+Start[1],All[1]}。通過這樣的分析,可以看出這個問題符合無后效性,可以使用動態(tài)規(guī)劃的方法來解決。

完整代碼如下(dev-c++環(huán)境下編譯運行):

#define max(x, y) (x > y ? x :y)

int MaxSum(int *A, int n)
{
     // 參數(shù)檢查
     int i = 0;
     int nStart = A[n-1];
     int nAll = A[n-1];
     for (i = n-2; i >= 0; i--)
     {
         nStart = max(A[i], nStart + A[i]);
         nAll = max(nStart, nAll);
    }
    return nAll;
}

int main()
{
     int A[] = {0, -2, 3, 5, -1, 2};
     printf("最大子數(shù)組和為:%d\n",MaxSum(A,6)); 
     system("pause"); 
     return 0;
} 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,916評論 0 33
  • 最大連續(xù)子序列問題 問題定義: 給定K個整數(shù)的序列{ N1, N2, ..., Nk },其任意連續(xù)子序列可表示為...
    HITMiner閱讀 16,791評論 3 8
  • 1 月老其實并不老,當他在天上的時候,還是臨風玉樹的模樣。也就是每次下凡的時候,非得變成一個全身都白,除了眼珠子還...
    大錢小胖閱讀 2,625評論 27 21
  • 明山寨位于大別山腹地岳西縣青天鄉(xiāng)西北部,與霍山縣接壤,范圍甚廣,是整個大別山脈的一部分。歷史記載,明山寨建于元末明...
    茶人老七閱讀 1,207評論 1 1
  • 我的2015用一個字來總結(jié):變 2015 —25周歲,是值得紀念的一年!25周歲,開啟了畢業(yè)后工作的第二段旅程,畢...
    原草家閱讀 164評論 0 0

友情鏈接更多精彩內(nèi)容