兩個概念:重疊子問題:如果乙個問題可以被分為若干個子問題,且這些子問題會重複出現,那麼就稱這個問題擁有重疊子問題
最優子結構:如果乙個問題的最優解可以由其子問題的最優解有效地構造出來,那麼稱這個問題擁有最優子結構
三者各自特點:分治:(分而治之),將原問題劃分成若干個規模較小而結構與原問題相同或相似的子問題,然後分別解決這些子問題,最後合併子問題的解,即可得到原問題的解。分治必須擁有子問題,但一定是不重疊的子問題,且該問題不一定是最優化問題
貪心:解決最優化問題,並希望由區域性最優策略來推得全域性最優結果。貪心演算法適用的問題必須滿足最優子結構
動態規劃:乙個問題必須擁有重疊子問題和最優子結構,才能使用動態規劃去解決
兩兩區別分治與動規:分治和動態規劃都是將問題分解為子問題,然後合併子問題的解得到原問題的解。但是不同的是,分治法分解出的子問題是不重疊的,因此分治法解決的問題不擁有(或者並不用在意)重疊子問題,而動態規劃解決的問題擁有重疊子問題(例如歸併排序和快速排序都是分別處理左序列和右序列,然後將左序列和右序列合併,過程中都不出現子問題,是分治)。此外,分治法解決的問題不一定是最優化問題,而動規解決的問題一定是最優化問題。
貪心與動規:貪心和動規都要求原問題必須擁有最優子結構。二者區別在於貪心採用的方式類似於「自頂向下」(每次最優-》全域性最優),但是並不是等待子問題求解完畢後再選擇使用哪乙個。而是通過一種策略直接選擇乙個子問題去求解,沒有被選擇的子問題就不去求解,直接拋棄。也就是說,他總是只在上一步選擇的基礎上繼續選擇,因此整個過程以一種單鏈的流水方式進行,顯然這種所謂的「最優選擇」的正確性要用歸納法證明。| 而動規不管是採用自底向上還是自頂向下的方式,都是從邊界開始向上得到目標問題的解。也就是說,它總是會考慮所有的子問題,並選擇繼承能得到最優結果的那個,對暫時沒被繼承的子問題,由於重疊子問題的存在,後期可能會再次考慮它們,因此還有機會成為全域性最優的一部分,不需要放棄。所以貪心是一種壯士斷腕的決策,只要進行了選擇,就不後悔;動規則要看哪個選擇笑到了最後,暫時的領先說明不了什麼。
貪心分治動規總結
概念看不懂是正常的,看懂了才不正常。有個小建議 先看一下概念,看完之後肯定感覺似懂非懂,沒關係去做題實踐出真知,每個型別做個8 9題,在回過頭來看概念會發現概念說的好像真是那麼回事兒,接著再去做題反覆練習就明白了。最優子結構 原問題的解包含子問題的解。子問題即規模更小的問題 例如,a b c,ab ...
貪心和動規的difference
很多同學在做動規題的時候,很容易做成貪心,的確,動規和貪心是很相近的,在很多時候,動規和貪心沒有明顯的界限,反而在很多時候,我們需要使用貪心的思想,對動規進行優化,不過這也就導致了很多同學分不清什麼題是動規,什麼題是貪心。現在我們來回憶一下,動規的思想是什麼,以前乙個或者多個狀態的最優值,加上現在這...
動規中的貪心思想 田忌賽馬
中國古代的歷史故事 田忌賽馬 是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩 如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的馬去對抗齊王的馬,才能贏取最多的錢?第一...