记忆化搜索 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) ...
随机推荐
- Windows下安装ZooKeeper
Windows下安装ZooKeeper 一.简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组 ...
- JAVA正则表达式匹配,替换,查找,切割(转)
import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...
- C# 使用缓存数据模拟抢购
在所有的电商网站中,不乏大量的抢购,比如双十一,双十二等等,作为一名开发人员考虑最多的就是多并发以及高并发 废话少说,开始写代码.我用了C#的MemoryCache代替试下流行的各种缓存 商品测试 ...
- python学习之-用scrapy框架来创建爬虫(spider)
scrapy简单说明 scrapy 为一个框架 框架和第三方库的区别: 库可以直接拿来就用, 框架是用来运行,自动帮助开发人员做很多的事,我们只需要填写逻辑就好 命令: 创建一个 项目 : cd 到需 ...
- 使用K-means进行聚类,用calinski_harabaz_score评价聚类效果
代码如下: """ 下面的方法是用kmeans方法进行聚类,用calinski_harabaz_score方法评价聚类效果的好坏 大概是类间距除以类内距,因此这个值越大越 ...
- Android 开发 Activity里获取View的宽度和高度 转载
原文地址:https://blog.csdn.net/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大 ...
- Flask对数据库的操作-----
首先得做好做基本的框架 # -*- encoding: utf-8 -*- from flask import Flask,render_template #导入第三方连接库sql点金术 from f ...
- vue文件上传
今天写一个文件上传的功能,开始想用element-ui的组件写,但是发现不知道怎么把文件标题和内容一起上传,所以用了经典的input框上传. 废话不多说,直接上代码. 这是表单: <el-for ...
- Mac系统home目录权限修改【转载】
转载自:http://ju.outofmemory.cn/entry/283070 最近,想把某程序安装到mac下的/home目录下面,发现没有权限,即便是使用sudo命令也无法创建程序目录,在网上查 ...
- [GNU] 喝一杯咖啡, 写一写 Makefile
Makefile 是 Linux 下组织程序的一个工具,它的命令是 make. (首字母M/m都可以) [Makefile] Makefile 编写的主旋律: target: [dependency] ...