FBI WARNING DP 從看透到看開

2022-05-12 08:33:32 字數 1413 閱讀 7918

眾(自)所(己)周(瞎)知(說) dp在noip應用的很多

動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。 當前子問題的解將由上一次子問題的解推出。使用動態規劃來解題只需要多項式時間複雜度, 因此它比回溯法、暴力法等要快許多。

現在讓我們通過乙個例子來了解一下dp的基本原理。

首先,我們要找到某個狀態的最優解,然後在它的幫助下,找到下乙個狀態的最優解。  ——by hawstein

和分治法一樣,動態規劃(dynamic programming)是通過組合子問題而解決整個問題的解。

分治法是將問題劃分成一些獨立的子問題,遞迴地求解各子問題,然後合併子問題的解。

動態規劃適用於子問題不是獨立的情況,也就是各子問題包含公共的子子問題。

此時,分治法會做許多不必要的工作,即重複地求解公共的子問題。動態規劃演算法對每個子問題只求解一次,將其結果儲存起來,從而避免每次遇到各個子問題時重新計算答案。

最優性原理體現為問題的最優子結構特性。當乙個問題的最優解中包含了子問題的最優解時,則稱該問題具有最優子結構特性。

最優性原理是動態規劃的基礎。任何乙個問題,如果失去了這個最優性原理的支援,就不可能用動態規劃設計求解。

1.問題中的狀態滿足最優性原理。

2.問題中的狀態必須滿足無後效性。

——by 劍仙

對於它的設計 我感覺應該有兩種方法:

自頂向下(直接跑記憶化搜尋):基本上對應著遞迴函式實現,從大範圍開始計算,要注意不斷儲存中間結果,避免重複計算。

自底向上(遞推):從小範圍遞推計算到大範圍。

dp有特別重要的兩點:

1.寫出方程。

2.確定邊界。

舉個栗子

乙個人每次只能走一層樓梯或者兩層樓梯,問走到第80層樓梯一共有多少種方法。

當我第一次看到這個題目的時候 感覺特別難 無從下手 仔細想想 還是有思路的

這個題是經典的一維動態規劃。爬樓梯數目其實是乙個斐波拉契數列。

假定f[i] 表示是爬到第i層的方法,那麼f[i] = f[i-1] + f[i-2] //第i層的方法數目等於第i-1層數目加上第i-2層數目。

初值:f[0] = 1, f[1] = 1。 //最開始沒有爬和第一層的方法數目為1.

輸出:f[n] 爬到第n層的方法數目。

上**:

#include using

namespace

std;

int f[10001] = ;//

初始化一下 避免後面出故障

intmain()

cout

到第sum層

return0;

}

有時間繼續補充(逃

從淺入深看透 索引

簡單來說,比如你想在圖書館借一本莫言的 一樓存的數學類,二樓醫學類,三樓文學類。在三樓一排存的徐志摩的,二排存的莫言的,三排存的林徽因的。索引就相當於引導,有人告訴你三樓二排存的莫言的,你就不用從一樓一本一本的去往上找,這就大大增加了查詢速度。來官方一點 索引能快速找出在某一列中有一特定值的行。不使...

看透女人心,從她喝酒表現開始

看透女人心,從她喝酒表現開始 善飲的女人,三四個男子不是對手,酒席上常見好勝的男子舉杯傲顧四周,而不懼杜康的女士含笑不露,而至酒杯桌球作響真佛露相時,那女子只是兩腮緋紅而已,那好勝的先生已是爛醉如泥。所以老到的酒客一般對女賓退避三舍敬而遠之,如向女子邀酒,贏了未必是本事,輸了則在酒桌上是身敗名裂難以...

看透需求,看清自己

農曆的年末,總是充滿了各種期待。拼年會,拼年終獎。熱鬧是別人的,我什麼都沒有。也不曾經歷過,也不會覺得很落寞。做著自己感興趣的事情,越做越乏味。功能都實現了,卻說使用者不需要,原來,需求都是產品經理個人的。需求是不確定的,需求總是在變。最大的悲哀還是,實際開發的人不能參與需求。最近覺得自己不想付出更...