P1464 Function(递归式的记忆化搜索)
传送门
题目描述
对于一个递归函数w(a,b,c)w(a,b,c)w(a,b,c)
如果a≤0a≤0orb≤0b≤0orc≤0c≤0a \le 0a≤0 or b \le 0b≤0 or c \le 0c≤0a≤0a≤0orb≤0b≤0orc≤0c≤0就返回值11.
如果a>20a>20orb>20b>20orc>20c>20a>20a>20 or b>20b>20 or c>20c>20a>20a>20orb>20b>20orc>20c>20就返回w(20,20,20)w(20,20,20)w(20,20,20)
如果a<ba<ba<ba<ba<ba<b并且b<cb<cb<cb<cb<cb<c 就返回w(a,b,c−1)+w(a,b−1,c−1)−w(a,b−1,c)w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,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)w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)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,ca,b,ca,b,c均为15时,调用的次数将非常的多。你要想个办法才行.
/*
比如 w(30,-1,0)w(30,−1,0)既满足条件1又满足条件2
这种时候我们就按最上面的条件来算
所以答案为1
*/
输入格式:
会有若干行。
并以-1,-1,-1结束。
保证输入的数在[−9223372036854775808,9223372036854775807][-9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807]之间,并且是整数。
输出格式:
输出若干行,每一行格式:
w(a,b,c)=answ(a, b, c) = answ(a,b,c)=ans
注意空格。
输入样例#1:
1 1 1
2 2 2
-1 -1 -1
输出样例#1:
w(1, 1, 1) = 2
w(2, 2, 2) = 4
分析
- 这道题是一道比较基础的记忆化搜索题目。依照题意,我们只需要开一个每一维都比20稍大的三维数组保存中间状态的值,避免递归过程中大量的重复计算就可以解决这道题了。
- 除此之外,因为数组下标不能为负,需要注意条件的判断。避免使用为负值或者越界的下标。
代码如下
import java.io.BufferedInputStream;
import java.util.*;
public class Main {static long ws[][][]=new long [25][25][25];static long w(int a,int b,int c) {if(a<=0 || b<=0 || c<=0)return 1;if(ws[a][b][c]==0) {if(a<b && b<c) ws[a][b][c]=w(a, b, c-1)+w(a, b-1, c-1)-w(a, b-1, c); else ws[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);}return ws[a][b][c];}public static void main(String[] args) {long a,b,c;Scanner cin=new Scanner(new BufferedInputStream(System.in));while(cin.hasNext()) {a=cin.nextInt();b=cin.nextInt();c=cin.nextInt();if(a==-1&&b==-1&&c==-1)break;if(a<=0 || b<=0 || c<=0) {System.out.println("w("+a+", "+b+", "+c+") = 1");}else if(a>20 || b>20 || c>20) {System.out.println("w("+a+", "+b+", "+c+") = "+w(20, 20, 20));}else {System.out.println("w("+a+", "+b+", "+c+") = "+w((int)a, (int)b, (int)c));}}cin.close();}
}
P1464 Function(递归式的记忆化搜索)相关推荐
- UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)
题目:UVA-10253 题目翻译(来自蓝书): 串并联网络有两个端点,一个叫源,一个叫汇,递归定义如下: (1) 一条单独的边是串并联网络. (2) 若G1和G2是串并联网络,把它们的源和源接在一起 ...
- 动态规划入门——记忆化搜索
文章目录 记忆化搜索 1.数塔问题 2.滑雪 总结 记忆化搜索 1.数塔问题 [动规:递归求解] 递推方程: 不难发现,最后一层的点到最后一层的最大距离即为自己对应的值a[n - 1][y],这个就是 ...
- 【记忆化搜索】P1464 Function
https://www.luogu.com.cn/problem/P1464 考点:记忆化搜索.递归.map 题意: 按照题目要求写递归函数. 解法: 在函数开始时查看哈希表中是否已经有答案记录,如果 ...
- 巧用记忆化搜索代替暴力递归(洛谷P1464题题解,Java语言描述)
题目要求 P1464题目链接 分析 如果--你信了这题干,真的写了递归--TLE警告!!! 所以,就需要优化嘛-- [−9223372036854775808,9223372036854775807] ...
- Python数据结构与算法分析 第四章 递归 贪心 动态规划bp 记忆化搜索
递归算法也总结出 三定律 1,递归算法必须有一个基本结束条件(最小规模问题的直接解决) 2, 递归算法必须能改变状态向基本结束条件演 进(减小问题规模) 3,递归算法必须调用自身 (解决减小了规 ...
- 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起&qu ...
- 记忆化搜索 递归缓存_需要微缓存吗? 营救记忆
记忆化搜索 递归缓存 缓存解决了各种各样的性能问题. 有很多方法可以将缓存集成到我们的应用程序中. 例如,当我们使用Spring时,可以轻松使用@Cacheable支持. 非常简单,但我们仍然必须配置 ...
- 数字三角形——递归、递推、记忆化搜索
数字三角形 描述: 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数. 问题: 从第一行的数开始,每次可以往左 ...
- 递归 dfs 记忆化搜索 动态规划
今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态--这种用自已来 ...
最新文章
- 使用editcap命令将ERF格式转换为pcap格式
- Nginx中worker connections问题的解决方法
- android 常用 style,Android中 Styles和Themes
- 2021-05-10 linux中的find命令——查找文件名
- 那些年,我们处理过的SQL问题
- 剑芒罗曼史2解图片程序
- html向下的箭头符号怎么打,向下的箭头怎么打
- 网络虚拟(包括overlay、underlay介绍)
- oracle sql查询取整,Oracle SQL语句操作数字:取整、四舍五入及格式化
- 安科瑞数据中心行业电能质量监测与治理方案-李亚俊
- CANopen协议,上位机开发(C#)
- 问卷星刷问卷python_Python+Selenium自动刷问卷星问卷
- 基于tkinter库txt文件操作的Python界面化图书管理系统
- 小程序商城源码代码分析
- Wilcoxon符号秩检验详解
- WIFI管家实现原理:局域网设备扫描
- 人脸检测之MTCNN:测试代码理解
- android 心形上漂动画,PowerPoint Viewer制作一个漂亮心形飞出动画的操作教程
- 聚类算法及python实现——模糊C均值(FCM)
- 复盘100道数据结构题型总结与案例分析