题目描述

对于一个递归函数w(a,b,c)w(a,b,c)w(a,b,c)

  • 如果a≤0a \le 0a≤0 or b≤0b \le 0b≤0 or c≤0c \le 0c≤0就返回值111.
  • 如果a>20a>20a>20 or b>20b>20b>20 or c>20c>20c>20就返回w(20,20,20)w(20,20,20)w(20,20,20)
  • 如果a<ba<ba<b并且b<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时,调用的次数将非常的多。你要想个办法才行.

/* absi2011 : 比如 w(30,−1,0)w(30,-1,0)w(30,−1,0)既满足条件1又满足条件2

这种时候我们就按最上面的条件来算

所以答案为1

*/

输入格式

会有若干行。

并以−1,−1,−1-1,-1,-1−1,−1,−1结束。

保证输入的数在[−9223372036854775808,9223372036854775807][-9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807]之间,并且是整数。

输出格式

输出若干行,每一行格式:

w(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
#include<iostream>
using namespace std;long a,b,c;
int result[21][21][21]={0};//用result数组保存计算过的数的结果long w(int a,int b,int c){if( a<=0 || b<=0 || c<=0) return 1;else if( a>20 || b>20 || c>20) return w(20,20,20);if(result[a][b][c]!=0) return result[a][b][c];//这句很重要 else if(a<b && b<c) {result[a][b][c-1] = w(a,b,c-1);result[a][b-1][c-1] = w(a,b-1,c-1);result[a][b-1][c] = w(a,b-1,c);return result[a][b][c-1] +result[a][b-1][c-1]-result[a][b-1][c];}//函数里面return之后就不会再执行return后面的东西了result[a-1][b][c] =w(a-1,b,c);result[a-1][b-1][c] = w(a-1,b-1,c); result[a-1][b][c-1] = w(a-1,b,c-1);result[a-1][b-1][c-1] = w(a-1,b-1,c-1);return result[a-1][b][c] +result[a-1][b-1][c] +  result[a-1][b][c-1] -result[a-1][b-1][c-1];}int main(){long a,b,c;while(true){cin>>a>>b>>c;if(a==-1 && b==-1 && c==-1) return 0;cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<w(a,b,c)<<endl;}
//  while(cin>>a>>b>>c){
//      if(a==-1 && b==-1 && c==-1) return 0;
//          cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<w(a,b,c)<<endl;
//  }return 0;
} //好苦恼啊 ,为啥用下面的while输入(注释掉的部分)就会错,自己编译出来都是对的,提交了之后就全错

落谷 P1464 function (空间换时间、记忆化搜索)相关推荐

  1. 洛谷:尼克的任务【记忆化搜索】【记忆化搜索的使用条件】

    个人对记忆化搜索有以下感悟[不保证一定正确,但保证有参考价值] 我们将搜索的过程看成在一个有向无环图上遍历的过程[也必然是这个过程]: 首先,记忆化搜索之所以能让时间复杂度为指数级别的搜索过程降到线性 ...

  2. 洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)

    题意 题目链接 求出把$n$分解为斐波那契数的方案数,方案两两不同的定义是分解出来的数不完全相同 Sol 这种题,直接爆搜啊... 打表后不难发现$<=1e18$的fib数只有88个 最先想到的 ...

  3. leetcode-383-Ransom Note(以空间换时间)

    题目描述: Given an arbitrary ransom note string and another string containing letters from all the magaz ...

  4. 巧用记忆化搜索代替暴力递归(洛谷P1464题题解,Java语言描述)

    题目要求 P1464题目链接 分析 如果--你信了这题干,真的写了递归--TLE警告!!! 所以,就需要优化嘛-- [−9223372036854775808,9223372036854775807] ...

  5. ie浏览器查看vue中js_浅析 Vue.js 中那些空间换时间的操作

    Hello,各位小伙伴,接下来的一段时间里,我会把我的课程<Vue.js 3.0 核心源码解析>中问题的答案陆续在我的公众号发布,由于课程的问题大多数都是开放性的问题,所以我的答案也不一定 ...

  6. 以空间换时间——动态规划算法及其应用:矩阵链相乘

    动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...

  7. JS哈希表算法——空间换时间

    题目来源力扣: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素 ...

  8. FPGA之道(62)时空变换之空间换时间

    文章目录 前言 时空变换之空间换时间 缓存提速使用 模块复制 同频模块复制 缓存降频复制 缓存降频使用 逻辑拆分 流水线 流水线的由来 如何在组合逻辑中使用流水线 如何在时序逻辑中使用流水线 顺序系统 ...

  9. 前端遍历导致查询数据时间过长_OLAP 服务器,空间换时间可行吗?

    [摘要] 全量预汇总真的是提高 OLAP 性能的可行方案吗?点击了解OLAP 服务器,空间换时间可行吗? 多维分析提供拖拽.旋转.切片.钻取等等人机交互操作,必须有秒级的响应速度.而这些操作对应的明细 ...

最新文章

  1. 深入理解Java自带的线程池和缓冲队列
  2. ascii码_umask,补码,ASCII码:稍微深入考虑一点
  3. Lindström–Gessel–Viennot lemma
  4. 魅族升级android p,高通宣布:这些手机将第一时间升级Android P!
  5. 华科团队发布 OVIS 遮挡视频实例分割基准数据集
  6. Oracle Restart能够用来给Oracle GoldenGate 做 High Availability 使用么?
  7. (转)淘淘商城系列——SSM框架整合之表现层整合
  8. MyBatis操作数据库
  9. 解决eclipse安装Darkest Dark Theme报错
  10. 雷电模拟器 服务器无响应,雷电模拟器怎么用脚本长时间运行未响应win10
  11. 题解 P2184 【贪婪大陆】
  12. MMR 排序多样化重排序算法
  13. IPv6技术详解:基本概念、应用现状、技术实践(上篇)
  14. 快速排序详细分析--单向扫描和双向扫描
  15. 【小样本基础】深度学习中的元学习:元学习的理解、经典MAML算法、用元学习解决具体问题的思路、元学习的分类
  16. Java同步器之AbstractOwnableSynchronizer详解
  17. JAVA开发与运维(docker运维常规操作)
  18. 一个U盘装N款系统不是梦!超级好用的装机神器来了!
  19. 软件测试周刊(第51期):漂漂亮亮、从从容容地出现在大家面前,不仅是虚荣的事,更是庄重与自信的事。 ​​​
  20. 初试vue写echarts可视化布局

热门文章

  1. Android为什么不能在子线程更新UI
  2. STM32 internal command error 问题
  3. 同样是模拟高清,谁才是真正的AHD?汽车OEM选型应慎重
  4. UC缓存的php格式视频,如何把UC浏览器缓存的零碎视频转换成完整的mp4
  5. 华为称包裹遭美国联邦快递“转运” 重新审视双方合作关系
  6. win7+ubuntu双系统双固态硬盘安装
  7. 什么是标签(Tags)
  8. 中国电信2016年IT研发工程师笔试题
  9. Android自定义可拖拽的悬浮按钮---DragFloatingActionButton
  10. 程序员们都在用什么键盘敲代码?