poj 1579(記憶化搜尋)

2021-06-04 23:05:48 字數 911 閱讀 5577

consider a three-parameter recursive function w(a, b, c):

if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 1

if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: w(20, 20, 20)

if a < b and b < c, then w(a, b, c) returns: w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)

otherwise it returns: w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)

這本身就是乙個遞迴函式,要是按照函式本身寫遞迴式,結果肯定是tle,這裡我開了乙個三維陣列,從w(0,0,0)開始遞推,逐步產生到w(20,20,20)的值,複雜度o(n^3).

總結:這道題是很地道的dp,因為它的子問題實在是太多了,所以將問題的結果儲存起來,劉汝佳《演算法藝術和資訊學競賽》中115頁講到自底向上的遞推,這個例子就非常典型。總體來說這個題目還是非常簡單的,不過這個思想是地道的動態規劃。

#include

#include

int w(int a,int b,int c)

int main()

return 0;

}以為是個水題,看來並不水啊!還是用三維陣列儲存吧,總結:能用遞推就不能用遞迴!超時的嚴重啊!

下面的是ac**:

#include

int main()

while(scanf("%d%d%d",&a,&b,&c)!=-1,a!=-1||b!=-1||c!=-1)

return 0;

}

POJ 1579 記憶化搜尋

問題描述 自定義函式w a,b,c 如果 a 0 或b 0 或 c 0,則返回結果 1 如果 a 20 或 b 20 或 c 20,則返回結果 w 20,20,20 如果 a b 且 b c,則返回結果 w a,b,c 1 w a,b 1,c 1 w a,b 1,c 否則返回結果 w a 1,b,c...

poj 1579 遞迴 記憶化搜尋

直接遞迴會重複計算一些值,如題所述會花費很長時間。最好的方法就是用記憶化搜尋,用陣列將值記錄下來,當搜到已經計算過的值時直接使用就行了,避免再一次遞迴計算,這樣會節省很多時間。如下 include using namespace std const int size 21 int map size ...

POJ 1579 記憶遞迴

題意 if a 0 or b 0 or c 0,then w a,b,c returns 1 if a 20 or b 20 or c 20,then w a,b,c returns w 20,20,20 if a b and b c,then w a,b,c returns w a,b,c 1 w...