记忆化搜索 P1464 Function
题目描述
对于一个递归函数w(a,b,c)
- 如果a≤0 or b≤0 or c≤0就返回值1.
- 如果a>20 or b>20 or 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,ca,b,ca,b,c均为15时,调用的次数将非常的多。你要想个办法才行.
/*
比如 w(30,−1,0)既满足条件1又满足条件2
这种时候我们就按最上面的条件来算
所以答案为1
*/
输入输出格式
输入格式:
会有若干行。
并以−1,−1,−1结束。
保证输入的数在[−9223372036854775808,9223372036854775807]之间,并且是整数。
输出格式:
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
这个时候肯定会想如果w(15,15,15)需要调用的w(a−1,b,c)+w(a−1,b−1,c)+w(a−1,b,c−1)−w(a−1,b−1,c−1)已知或部分已知就会简单一些,记忆化搜索可以减少计算次数,提高效率。
下面先上代码:
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll rem[][][]; ll w(ll a, ll b, ll c)
{
if (a <= || b <= || c <= )
return ;
else if (rem[a][b][c] != )
return rem[a][b][c];
else if (a > || b > || c > )
rem[a][b][c]=w(, , );
else if (a < b&&b < c)
rem[a][b][c] = w(a, b, c - ) + w(a, b - , c - ) - w(a, b - , c);
else
rem[a][b][c] = w(a - , b, c) + w(a - , b - , c) + w(a - , b, c - ) - w(a - , b - , c - );
return rem[a][b][c];
} int main()
{
ll a, b, c;
while ()
{
cin >> a >> b >> c;
memset(rem, , sizeof(rem));
if (a == - && b == - && c == -)
break;
cout << "w(" << a << ", " << b << ", " << c << ") = "; //1
if (a > ) a = ;
if (b > ) b = ;
if (c > ) c = ;
cout<< w(a, b, c)<<endl; //2
}
getchar();
getchar();
return ;
}
(后面是写给自己的。。)
作为一个菜鸟,在做这个的时候出现了很多小错误,比如我把1句和2句一起放在了三个if语句的下面,导致全部wa(因为这个时候a或b或c的值可能改变了),还有在前面的递归上,rem[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c)这句最开始写的是return w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c)所以一直是超时的,然后发现这个问题之后我就完全明白了。
记忆化搜索 P1464 Function的更多相关文章
- 洛谷 P1464 Function【记忆化搜索】
题目链接 题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w ...
- HDU 1331 Function Run Fun(记忆化搜索)
Problem Description We all love recursion! Don't we? Consider a three-parameter recursive function w ...
- POJ 1579 Function Run Fun 【记忆化搜索入门】
题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Tota ...
- Function——记忆化搜索
题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...
- 记忆化搜索 dp学习~2
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...
- 专题1:记忆化搜索/DAG问题/基础动态规划
A OpenJ_Bailian 1088 滑雪 B OpenJ_Bailian 1579 Function Run Fun C HDU 1078 FatMouse and Chee ...
- poj 1579(动态规划初探之记忆化搜索)
Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17843 Accepted: 9112 ...
- 记忆化搜索:POJ1579-Function Run Fun(最基础的记忆化搜索)
Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14815 Accepted: 7659 Des ...
- 记忆化搜索 hdu 1331
Function Run Fun Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- Tree Traversals Again
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...
- asp.net mvc5中使用Swagger 自动生成WebApi文档笔记
Swagger可以自动生成Api说明文档,并内置在线测试,通过NSwagStudio还可以自动生成Api客户端调用代码,以下为具体实现步骤 1.写一个简单的WebApi并加上注释 public cla ...
- Specified key was too long; max key length is 767 bytes解决方案
问题描述: 1. 使用spark sql处理数据逻辑,逻辑处理后使用 df.write.mode(saveMode).jdbc(url, tableName, connectionPropertie ...
- 如何确保Memcache数据读写操作的原子性(转)
什么是CAS协议 Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过 ...
- html+css常用小笔记(持续更新)
1 去掉input点击时的蓝色边框 outline:none; 2 禁止文本选中 -webkit-touch-callout: none; /* iOS Safari */ -webkit-user- ...
- 【学习】数据聚合和分组运算【groupby】
分组键可以有多种方式,且类型不必相同 列表或数组, 某长度与待分组的轴一样 表示DataFrame某个列名的值 字典或Series,给出待分组轴上的值与分组名之间的对应关系 函数用于处理轴索引或索引中 ...
- bochs的bochsrc说明
########################################## Configuration file for bochs ################### ...
- idea使用
一.IDEA 的下载及安装 打开IDEA的官网,如:http://www.jetbrains.com/ 然后到了主界面,点击下载如图: 图1 我们这里下载zip的,将它下载到你要保存的目录下,其次 ...
- Java自学如何找工作
今天聊一下可能大多数人都关注的问题“自学Java如何找工作”那么首先你就要明确现在招聘Java开发的基本要求是什么?下面我们来看一下招聘网站上面的要求,在这里我只随便找了一个比较全面的要求,自己可以去 ...
- PHP入门——基本巩固
----------一.变量 ----------二.运算 ----------三.控制结构 ----------四.函数 ----------六.字符串 ----------七.数组 ------- ...