【记忆化搜索】P1464 Function
生活随笔
收集整理的這篇文章主要介紹了
【记忆化搜索】P1464 Function
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.luogu.com.cn/problem/P1464
考點:記憶化搜索、遞歸、map
題意:
按照題目要求寫遞歸函數。
解法:
在函數開始時查看哈希表中是否已經有答案記錄,如果有就直接返回。如果沒有答案,則正常執行,返回前把答案添加到哈希表,記憶化搜索可以大幅度提高遞歸的效率。
實際上是水題,但是我卡了挺長時間的,原因是對STL的map不熟悉。我自定義了一個三元組類用來表示3個參數,是類似pair的數據結構。
對于自定義類作為map的鍵的時候,必須重載小于運算符,而且不能亂寫,我一開始只對比了a的值,導致map索引失敗。正確做法應該是依次比較abc的值。
完整代碼:
#include <bits/stdc++.h> using namespace std; using ll = long long; struct TT {ll a,b,c;TT(ll x, ll y, ll z) {a=x; b=y; c=z;}bool operator<(const TT &t) const { if (a != t.a) return a < t.a;if (b != t.b) return b < t.b;return c < t.c;} }; map<TT, ll> M; ll w(ll a, ll b, ll c) {if (M.find({a,b,c}) != M.end()) return M[{a,b,c}];if (a <= 0 || b <= 0 || c <= 0) {M[{a,b,c}] = 1;return 1;}if (a > 20 || b > 20 || c > 20) {ll res = w(20, 20, 20);M[{a,b,c}] = res;return res;}if (a < b && b < c) {ll res = w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c);M[{a,b,c}] = res;return res;}ll res = w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);M[{a,b,c}] = res;return res; } int main() {ll a,b,c;while (cin >> a >> b >> c) {if (a == -1 && b == -1 && c == -1) break;cout << "w(" << a << ", " << b << ", " << c << ") = " << w(a,b,c) << endl;}return 0; }總結
以上是生活随笔為你收集整理的【记忆化搜索】P1464 Function的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【筛素数】P1579 哥德巴赫猜想(升级
- 下一篇: nginx + openssl 搭建需要