日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

分治算法-01连续子序列的最大和问题

發(fā)布時(shí)間:2024/4/11 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分治算法-01连续子序列的最大和问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

連續(xù)子序列的最大和

  • 前言
    • 分治算法的核心思想是將一個(gè)規(guī)模很大的問(wèn)題化簡(jiǎn)為n個(gè)規(guī)模較小的問(wèn)題,這些子問(wèn)題雖然獨(dú)立而不同,但是問(wèn)題的本質(zhì)是一致的,從而達(dá)到分而治之的目的。
    • 首先通過(guò)“分”將問(wèn)題分解為n個(gè)子問(wèn)題,再將子問(wèn)題一步步分解,知道達(dá)到最小的子問(wèn)題。這時(shí),“治”子問(wèn)題再利用子問(wèn)題的解推導(dǎo)總問(wèn)題的解。
    • 子問(wèn)題應(yīng)與原問(wèn)題擁有同樣的結(jié)構(gòu),或者擁有同樣的形式。只有這樣,才能利用遞歸解決子問(wèn)題。
  • 問(wèn)題描述
    • 給定一個(gè)列表數(shù)據(jù),其中數(shù)據(jù)可正可負(fù),找出和最大的子列表的和,子列表不能為空。
  • 問(wèn)題分析
    • 這類題其實(shí)用DP也是一種解題思路,當(dāng)然也是分治的經(jīng)典問(wèn)題。
    • 看一個(gè)例子,輸入列表如下。
      • [-2, 1, -3, 4, -1, 2, 1, -5, 4]
      • 按照分治的思路,最大子列表有可能在左子列表、右子列表或左子列表和右子列表之間。我們需要做的就是找到左子列表的最大子列表的和、右子列表的最大子列表的和、左子列表與右子列表之間的子列表的最大和,再進(jìn)行比較。
      • 如何找到左子列表與右子列表的最大子列表的和呢?分治的想法是:讓左左子列表與右子列表的子列表回答這個(gè)問(wèn)題就好了,此時(shí)此刻不需要知道答案,只需要知道答案有三種可能。
      • 現(xiàn)在需要做的是找到第三種可能,也就是左子列表與右子列表之間的子列表的最大和。設(shè)一個(gè)中點(diǎn),遍歷中點(diǎn)左邊的值,跟蹤記錄已經(jīng)遍歷過(guò)的值的總和,取這些總和的最大值;同樣的方法遍歷中點(diǎn)右邊的值。最后,左邊的最大值加上右邊的最大值加上中點(diǎn)值就是想要的值。
      • 那么如何找第一種可能,也就是左子列表的最大和。其實(shí),對(duì)待左子列表的方式和對(duì)待列表一樣,還是有三個(gè)可能,第一個(gè)與第二個(gè)不關(guān)心,第三個(gè)按照上面的做法尋找。
      • 如何找到第二種可能與上面一致。
      • 按照這個(gè)一步步分解的思路,其實(shí),最后左右子列表都各有一個(gè)值,結(jié)果為三種可能最大的。最終,根據(jù)子問(wèn)題推到了大問(wèn)題的三種可能值,最終得到答案。
  • 代碼
    • # -*-coding:utf-8-*-def LSS(array):if array == []:returnif len(array) == 1:return array[0]cut = len(array) // 2 # 設(shè)置中點(diǎn)left_sum = LSS(array[: cut])right_sum = LSS(array[cut:])# 從中點(diǎn)開(kāi)始分別左右遍歷查值left_middle_sum = 0max_l = 0right_middle_sum = 0max_r = 0for i in range(cut-1, -1, -1):left_middle_sum += array[i]max_l = max(left_middle_sum, max_l)for j in range(cut+1, len(array), 1):right_middle_sum += array[j]max_r = max(right_middle_sum, max_r)return max(left_sum, right_sum, max_l+max_r+array[cut])if __name__ == '__main__':array = [-2, 1, -3, 4, -1, 2, 1, -5, 4]rst = LSS(array)print(rst)
  • 運(yùn)行結(jié)果
  • 補(bǔ)充說(shuō)明
    • 具體代碼可以查看我的Github,歡迎Star或者Fork
    • 參考書(shū)《你也能看得懂的Python算法書(shū)

總結(jié)

以上是生活随笔為你收集整理的分治算法-01连续子序列的最大和问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。