以前極少寫記憶化,大多都是直接推遞推方程,推。不。動。。。
所謂記憶化,就是一種優雅的暴力,最近在寫數字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 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...