记忆化搜索之P1464 Function
来源:互联网 发布:约翰马尔科维奇 知乎 编辑:程序博客网 时间:2024/05/22 13:37
题目描述
对于一个递归函数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,c均为15时,调用的次数将非常的多。你要想个办法才行.
输入输出格式
输入格式:会有若干行.
并以-1,-1,-1结束.
保证输入的数在-9223372036854775808~9223372036854775807之间,并且是整数
输出格式:输出若干行 格式: w(a,_b,_c)_=_你的输出(_代表空格)
输入输出样例
输入样例#1:
1 1 12 2 2-1 -1 -1输出样例#1:
w(1, 1, 1) = 2w(2, 2, 2) = 4
- 题解
这题目刚开始傻傻地按照题意模拟递归,但是残忍的TLE告诉了我,这题必须用记忆化。也就是说,我们先按照题意把递归的内容写出来,然后把每次0~20以内的答案记录下来,下一次递归时如果rpt(x,y,z)有记录就直接输出就行啦,能省去大量的时间。另外有个细节值得注意(我就是因为这个错了好几次QAQ),良心(bian tai)的出题人会在输入中弄几个负数出来,这样的话你一开始的判断语句如果只写if(f[x][y][z])就炸了(因为不能访问数组负数下标啊呵呵呵),因此加一个特判就行了。
//注:百度“记忆化搜索”
记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。
一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。
更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。
记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,
以后再次遇到这个状态的时候,就不必重新求解了。
这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。
一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。
更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。
记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,
以后再次遇到这个状态的时候,就不必重新求解了。
这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。
#include <bits/stdc++.h>using namespace std;typedef long long ll;ll rpt[25][25][25];ll w(ll a,ll b,ll c){ if(a<=0||b<=0||c<=0) return 1; else if(rpt[a][b][c]!=0) return rpt[a][b][c]; else if(a>20||b>20||c>20) rpt[a][b][c]=w(20,20,20); else if(a<b&&b<c) rpt[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c); else rpt[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 rpt[a][b][c];}int main(){ ll a,b,c; while(scanf("%lld%lld%lld",&a,&b,&c)==3){ memset(rpt,0,sizeof(rpt)); if(a==-1&&b==-1&&c==-1) break; printf("w(%lld, %lld, %lld) = ",a,b,c); if(a>20) a=21; if(b>20) b=21; if(c>20) c=21; printf("%lld\n",w(a,b,c)); } return 0;}
阅读全文
0 0
- 记忆化搜索之P1464 Function
- 记忆化搜索的学习经历——洛谷P1464:Function详解
- 【搜索】洛谷 P1464 Function
- luogu【P1464】Function
- 洛谷 P1464 Function
- Function Run Fun(记忆化搜索)
- 记忆化搜索--剪枝 vijos Function(Function(F...
- hdu4597之记忆化搜索
- 记忆化搜索之拍卖
- 记忆化搜索:POJ1579-Function Run Fun(最基础的记忆化搜索)
- POJ-1579-Function Run Fun-递归,记忆化搜索
- hdu 1331 Function Run Fun(记忆化搜索)
- POJ 1579 Function Run Fun【记忆化搜索】
- POJ 1579 Function Run Fun 记忆化搜索
- poj-1579-Function Run Fun(记忆化搜索)
- HDU--1579 -- Function Run Fun [记忆化搜索] [深搜]
- poj 1579 Function Run Fun 记忆化搜索
- hdu1579 Function Run Fun 记忆化搜索启蒙题
- 训练日记8.12
- Apache 配置CGI脚本操作数据库
- 观察者模式
- java基础
- 生产者消费者模式
- 记忆化搜索之P1464 Function
- Spring入门介绍
- OpenCV结合socket进行实时视频传输(TCP协议)
- 线程基础/线程同步和互斥
- Atcoder Transit Tree Path
- istringstream用法
- 【 2017"百度之星"程序设计大赛
- 20170812
- uva 1572 Self-Assembly