洛谷P1464 Function HDU P1579 Function Run Fun
洛谷P1464 Function HDU P1579 Function Run Fun
题目描述
对于一个递归函数w(a,b,c)
- 如果a≤0 or b≤0 or c≤0就返回值11.
- 如果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,c均为15时,调用的次数将非常的多。你要想个办法才行.
/* absi2011 : 比如 w(30,-1,0)w(30,−1,0)既满足条件1又满足条件2
这种时候我们就按最上面的条件来算
所以答案为1
*/
输入格式
会有若干行。
并以-1,-1,-1−1,−1,−1结束。
保证输入的数在[-9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807]之间,并且是整数。
输出格式
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
输入输出样例
1 1 1
2 2 2
-1 -1 -1
w(1, 1, 1) = 2
w(2, 2, 2) = 4
说明/提示
记忆化搜索
Solution
朴素
先试试硬算,结果a,b,c超过8,就要十几秒……
为什么会这么慢呢?
原因在于我们写的函数调用太多次了!
而每次调用函数都要把实参赋值给形参
这个过程累加起来,就会很慢啦
突破口
既然反复调用函数来计算相同的一些值,为什么不在计算某一组a,b,c时将它们保存下来,下次计算时只要直接取用即可嘛!
数据范围也是很小了,0~20,所以一个213的数组即可记录全部!
Code
#include<bits/stdc++.h>
using namespace std;
int a,b,c,ra,rb,rc;
int memory[][][];
long long w(int a,int b,int c)
{
if(a<=||b<=||c<=){
return ;
}
if(a>||b>||c>){
return w(,,);
}
if(memory[a][b][c]!=-) return memory[a][b][c];
if(a<b&&b<c){
return memory[a][b][c]=w(a,b,c-)+w(a,b-,c-)-w(a,b-,c);
}
return memory[a][b][c]=w(a-,b,c)+w(a-,b-,c)+w(a-,b,c-)-w(a-,b-,c-);
}
int main()
{
memset(memory,-,sizeof(memory));
cin>>a>>b>>c;
while(a!=-||b!=-||c!=-){
int ans=w(a,b,c);
printf("w(%d, %d, %d) = %d\n",a,b,c,ans);
// memory[a][b][c]=ans;
cin>>a>>b>>c;
}
return ;
}
Attention
事实证明,还有一种方法:只要打出表一小部分放在数组中,不用记忆化搜索,程序也可以算的很快的!
洛谷P1464 Function HDU P1579 Function Run Fun的更多相关文章
- (水题)洛谷 - P1464 - Function
https://www.luogu.org/problemnew/show/P1464 #include<bits/stdc++.h> using namespace std; #defi ...
- 洛谷 P1464 Function【记忆化搜索】
题目链接 题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w ...
- 洛谷 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,2 ...
- 洛谷 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,2 ...
- 洛谷P1464 Function
对于一个递归函数w(a,b,c)w(a,b,c) 如果a \le 0a≤0 or b \le 0b≤0 or c \le 0c≤0就返回值11. 如果a>20a>20 or b>20 ...
- 【洛谷p1464】 Function
中考第一天: 感觉我超废: 就是看这道题特别顺眼emmm SOLUTION: 思路的话是开三维数组s[i][j][k],先三重for循环预处理出s[0~20][0~20][0~20]的w(a,b,c) ...
- 【做题笔记】洛谷P1464 Function
我先谔谔一波 /kk 我谔谔 看题第一眼:欸这不就是按题意递归嘛,,直接搞不就好了 3 min 后,重新看题 然后自己手玩了几个样例,噢,递归太多了,铁定会 T 啊...... 然后,作为一个从没写过 ...
- 洛谷 P1464 Function(简单记忆化)
嗯... 让一切从水开始吧... 水过初赛,但愿复赛能够接着水过... 这道题不记忆化会tle,所以用空间换时间,将每次的答案(只有20*20*20个)存下来,如果之前已经求过,就不需要重复求了... ...
- java实现 洛谷 P1464 Function
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.S ...
随机推荐
- Arduino系列之按键模块(一)
今天我将简单介绍按键模块计数的原理: 我们常用的按键及按键模块有2脚和4脚的,其内部结构如图所示,当按下按键时就会接通按键两端,当放开时,两端自然断开. ...
- C语言寒假大作战03
这个作业属于哪个课程 软件4班 这个作业要求在哪里 C语言寒假大作战03 这个作业的目标 增加菜单程序各年级题目操作函数 参考文献 随机数rand 2.2.2 设计思路和遇到的问题 这次作业写好没多久 ...
- Selenium实现微博自动化运营:关注、点赞、评论
目录 Selenium 是什么? 一.核心代码 二.步骤分解 1.打开浏览器 2.访问微博登录页 3.输入账号密码 4.点击登录 5.通过人机验证 6.打开我们的中公题库君首页 7.加一下关注 8.定 ...
- [python之路]学习路线
python基础 #为什么要学python?python在知名公司广泛应用,谷歌.cia.nasa.youtobe.dropbox.instagram.facebook.redhat.豆瓣.知乎.搜狐 ...
- HYSBZ_2002_分块
http://www.lydsy.com/JudgeOnline/problem.php?id=2002 分块基础题,初次接触,很巧妙. OJ好像挂了,没法提交. #include<iostre ...
- vue文件引入全局样式导致样式重复
通常项目中src下的子目录都会有一个style文件夹,专门用来存放全局的样式文件. 这个style文件夹下,一般有reset.css.var.scss.mixin.scss.class.scss.in ...
- 题解 SP1716 【GSS3 - Can you answer these queries III】
\[ Preface \] 没有 Preface. \[ Description \] 维护一个长度为 \(n\) 的数列 \(A\) ,需要支持以下操作: 0 x y 将 \(A_x\) 改为 \( ...
- 全局new和宏结合起来的一个小应用
#include <iostream> using namespace std; void* operator new(size_t size, const char* file, int ...
- 导出Chrome浏览器中保存的密码
title: 导出Chrome浏览器中保存的密码 date: 2018-02-11 17:54:51 tags: --- 导出Chrome浏览器中保存的密码 先知看到的,挺有意思,记录一下 不同浏览器 ...
- Update、Insert注入技巧
title: Update.Insert注入技巧 date: 2017-10-23 18:07:57 tags: ["注入"] 审计了不少代码,再看代码的时候最多出现的就是注入,很 ...