簡單記憶化搜尋

2021-08-29 20:58:29 字數 1607 閱讀 8081

以前極少寫記憶化,大多都是直接推遞推方程,推。不。動。。。

所謂記憶化,就是一種優雅的暴力,最近在寫數字dp,總感覺好強大的暴力。。。

poj 1579 function run fun

分析:按照題意記憶化,每一步都記憶化一下;

#include #include #include #include using namespace std;

typedef pairpi;

typedef pairpii;

typedef long long ll;

const ll mod = 1e9 + 7;

const int maxn = 1e6 + 100;

ll dp[22][22][22];

inline ll dfs(int a, int b, int c)

if(a < b && b < c)

if(dp[a - 1][b][c] < 0) dp[a - 1][b][c] = dfs(a - 1, b, c);

if(dp[a - 1][b][c - 1] < 0) dp[a - 1][b][c - 1] = dfs(a - 1, b, c - 1);

if(dp[a - 1][b - 1][c] < 0) dp[a - 1][b - 1][c] = dfs(a - 1, b - 1, c);

if(dp[a - 1][b - 1][c - 1] < 0) dp[a - 1][b - 1][c - 1] = dfs(a - 1, b - 1, c - 1);

if(dp[a][b][c] < 0) dp[a][b][c] = dp[a - 1][b][c] + dp[a - 1][b][c - 1] + dp[a - 1][b - 1][c] - dp[a - 1][b - 1][c - 1];

return dp[a][b][c];

}int main()

return 0;

}

poj 1088 滑雪

經典記憶化,寫記憶化好有意思,比推方程輕鬆多了(侷限)。。。

#include #include #include #include using namespace std;

typedef pairpi;

typedef pairpii;

typedef long long ll;

const ll mod = 1e9 + 7;

const int maxn = 105;

int a[maxn][maxn], dp[maxn][maxn];

int dx = ;

int dy = ;

int n, m;

bool so(int x, int y)

inline ll dfs(int x, int y)

}dp[x][y] = cnt; //記憶化

return cnt;

}int main()

}ll ans = 0;

for(int i = 1; i <= n; ++i)

}printf("%lld\n", ans + 1);

return 0;

}

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...

記憶化搜尋

記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...

記憶化搜尋

原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...