洛谷P1464 Function 题解
1.洛谷P1028 [NOIP 2001 普及组] 数的计算 题解
2.洛谷P1464 Function 题解
3.洛谷P2440 木材加工 题解4.洛谷P2678 [NOIP 2015 提高组] 跳石头 题解5.洛谷P1314 [NOIP 2011 提高组] 聪明的质监员 题解6.洛谷P1083 [NOIP 2012 提高组] 借教室 题解7.洛谷P1902 刺杀大使 题解8.洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解9.洛谷P2280 [HNOI2003] 激光炸弹 题解10.洛谷P8218 【深进1.例1】求区间和 题解11.洛谷 P1719 最大加权矩形 题解12.洛谷 P2367 语文成绩 题解13.洛谷P1387 最大正方形 题解14.洛谷P1014[NOIP 1999 普及组] Cantor 表 题解15.洛谷P1563 [NOIP 2016 提高组] 玩具谜题 题解16.洛谷P4924 [1007] 魔法少女小Scarlet 题解17.洛谷P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two 题解18.洛谷P1786 帮贡排序 题解19.洛谷P1990 覆盖墙壁 题解20.洛谷P1010 [NOIP 1998 普及组] 幂次方 题解21.洛谷P1259 黑白棋子的移动 题解22.洛谷P1281 书的复制 题解23.洛谷P1396 营救 题解24.洛谷PP1570 KC 喝咖啡25.洛谷P1661 扩散 题解26.洛谷P1843 奶牛晒衣服 题解Function
题目描述
对于一个递归函数 \(w(a,b,c)\)
- 如果 \(a \le 0\) 或 \(b \le 0\) 或 \(c \le 0\) 就返回值 \(1\)。
- 如果 \(a>20\) 或 \(b>20\) 或 \(c>20\) 就返回 \(w(20,20,20)\)
- 如果 \(a<b\) 并且 \(b<c\) 就返回 \(w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,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)\)
这是个简单的递归函数,但实现起来可能会有些问题。当 \(a,b,c\) 均为 \(15\) 时,调用的次数将非常的多。你要想个办法才行。
注意:例如 \(w(30,-1,0)\) 又满足条件 \(1\) 又满足条件 \(2\),请按照最上面的条件来算,答案为 \(1\)。
输入格式
会有若干行。
并以 \(-1,-1,-1\) 结束。
输出格式
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
样例 #1
样例输入 #1
1 1 1 2 2 2 -1 -1 -1
样例输出 #1
w(1, 1, 1) = 2 w(2, 2, 2) = 4
提示
数据规模与约定
保证输入的数在 \([-9223372036854775808,9223372036854775807]\) 之间,并且是整数。
保证不包括 \(-1, -1, -1\) 的输入行数 \(T\) 满足 \(1 \leq T \leq 10 ^ 5\)。
题解
思路
这道题其实就是一道模拟+记忆化的题目,根据原有题目给定的步骤写一个递归函数出来,再稍微加上一点记忆化搜索即可。
代码
#include<bits/stdc++.h> #define endl '\n' #define ll long long using namespace std; ll A, B, C; ll mp[35][35][35]; ll w(ll a, ll b, ll c) { if(a <= 0 || b <= 0 || c <= 0) return 1; else if(a > 20 || b > 20 || c > 20) return w(20, 20, 20); else if(a < b && b < c) { if(!mp[a][b][c - 1]) { mp[a][b][c - 1] = w(a, b, c - 1); } if(!mp[a][b - 1][c - 1]) { mp[a][b - 1][c - 1] = w(a, b - 1, c - 1); } if(!mp[a][b - 1][c]) { mp[a][b - 1][c] = w(a, b - 1, c); } mp[a][b][c] = mp[a][b][c - 1] + mp[a][b - 1][c - 1] - mp[a][b - 1][c]; } else { if(!mp[a - 1][b][c]) { mp[a - 1][b][c] = w(a - 1, b, c); } if(!mp[a - 1][b - 1][c]) { mp[a - 1][b - 1][c] = w(a - 1, b - 1, c); } if(!mp[a - 1][b][c - 1]) { mp[a - 1][b][c - 1] = w(a - 1, b, c - 1); } if(!mp[a - 1][b - 1][c - 1]) { mp[a - 1][b - 1][c - 1] = w(a - 1, b - 1, c - 1); } mp[a][b][c] = mp[a - 1][b][c] + mp[a - 1][b - 1][c] + mp[a - 1][b][c - 1] - mp[a - 1][b - 1][c - 1]; } return mp[a][b][c]; } int main() { while(1) { cin >> A >> B >> C; if(A == -1 && B == -1 && C == -1) break; cout << "w(" << A << ", " << B << ", " << C << ") = " << w(A, B, C) << endl; } return 0; }
本文作者:2789617221guo
本文链接:https://www.cnblogs.com/2789617221guo/p/18700118
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步