日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【记忆化搜索】P1464 Function

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【记忆化搜索】P1464 Function 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.luogu.com.cn/problem/P1464

考點:記憶化搜索、遞歸、map

題意:
按照題目要求寫遞歸函數。

解法:
在函數開始時查看哈希表中是否已經有答案記錄,如果有就直接返回。如果沒有答案,則正常執行,返回前把答案添加到哈希表,記憶化搜索可以大幅度提高遞歸的效率。
實際上是水題,但是我卡了挺長時間的,原因是對STL的map不熟悉。我自定義了一個三元組類用來表示3個參數,是類似pair的數據結構。

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的鍵的時候,必須重載小于運算符,而且不能亂寫,我一開始只對比了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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。