P1464 Function
题目链接:
本题为一道极其经典的记忆化搜索模板题,务必搞懂并掌握记忆化搜索的常见书写格式。
主要思想就是用一个
#include <cstdio> #include <cstring> using LL = long long; LL dp[25][25][25]; LL w(LL a, LL b, LL c) { if (a <= 0 || b <= 0 || c <= 0) return 1; if (a > 20 || b > 20 || c > 20) return w(20, 20, 20); if (dp[a][b][c] != -1) return dp[a][b][c]; if (a < b && b < c) { return dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c); } return dp[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1); } int main() { LL a, b, c; memset(dp, -1, sizeof dp);//记忆数组最好初始化为-1而不是0(本题初始化为0也能AC) while (scanf("%lld%lld%lld", &a, &b, &c) != EOF) { if (a == -1 && b == -1 && c == -1) return 0; printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, w(a, b, c)); } }
注意:
值得注意的一点是,若把判断语句写在函数一开始,还需先判断一下
LL w(LL a, LL b, LL c) { if (a >= 0 && a <= 25 && b >= 0 && b <= 25 && c >= 0 && c <= 25 && dp[a][b][c] != -1) return dp[a][b][c]; if (a <= 0 || b <= 0 || c <= 0) return 1; if (a > 20 || b > 20 || c > 20) return w(20, 20, 20); if (a < b && b < c) { return dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c); } return dp[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1); }
本文作者:pangyou3s
本文链接:https://www.cnblogs.com/pangyou3s/p/18125490
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步