CF392BTower of Hanoi(记忆化搜索)
CF392B
记搜好题
预处理
题目给出了将一个盘从x移到y的代价(代码中为a[][]),当我们知道这并不是最优的
就像最短路floyd一样松弛操作预处理得到两柱之间最优值b[][]
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
scanf("%lld",&a[i][j]),b[i][j]=a[i][j];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++) if(i!=j)
for(int k=1;k<=3;k++) if(k!=i&&k!=j)
b[i][j]=min(b[i][j],b[i][k]+b[k][j]);
记搜主体
冷静分析,每次搬n个盘子都有两种搬法:
- 方法一
- 方法二
我们知道每次最大盘的代价直接就是a[][],而其余n-1个是可以由递归记搜得到的
当递归到只剩一个盘时,只需要用预处理出的最优解b[][]即可
int dfs(int l,int r,int n){
if(f[l][r][n]) return f[l][r][n]; //已经走过,直接返回
if(n==1) return b[l][r]; //递归边界,只剩一个盘
int x=6-l-r; //表示中介盘,因为三个盘编号之和为6
int an1=dfs(l,x,n-1)+dfs(x,r,n-1)+a[l][r]; //方法一
int an2=(dfs(l,r,n-1)<<1)+dfs(r,l,n-1)+a[l][x]+a[x][r]; //方法二
return f[l][r][n]=min(an1,an2); //取个最优值
}
dfs(l,r,n)表示将n个盘从l移到r的方案数
所以答案就是dfs(1,3,n)
注意这题还会爆int
AC代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a[5][5],b[5][5],f[5][5][50];
int dfs(int l,int r,int n){
if(f[l][r][n]) return f[l][r][n];
if(n==1) return b[l][r];
int x=6-l-r;
int an1=dfs(l,x,n-1)+dfs(x,r,n-1)+a[l][r];
int an2=(dfs(l,r,n-1)<<1)+dfs(r,l,n-1)+a[l][x]+a[x][r];
return f[l][r][n]=min(an1,an2);
}
signed main(){
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
scanf("%lld",&a[i][j]),b[i][j]=a[i][j];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++) if(i!=j)
for(int k=1;k<=3;k++) if(k!=i&&k!=j)
b[i][j]=min(b[i][j],b[i][k]+b[k][j]);
scanf("%lld",&n);
printf("%lld",dfs(1,3,n));
}
CF392BTower of Hanoi(记忆化搜索)的更多相关文章
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- zoj 3644(dp + 记忆化搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
- HDU1978 记忆化搜索
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- bzoj4562: [Haoi2016]食物链--记忆化搜索
这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞 题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路 从入读为零的点进行记忆化搜索,搜到出度为零的点返回1 所有 ...
- 数位dp/记忆化搜索
一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an ...
随机推荐
- 转载几篇文章URL
读了百伯在线Jobbole的几篇文章,转给需要的朋友.如下: 产品小设计大体验:http://blog.jobbole.com/39593/ 苹果是一家有工程师的设计公司:Google是一家有设计师的 ...
- HTML连载12-体验CSS
一.通过标签来修改标签有哪些缺点: (1)需要记忆那些标签有哪些属性 (2)若该标签没有这个属性,则修改失败 (3)需求变更,需要修改大量的代码 (4)HTML标签及用于添加语义,与我们的定义不相符 ...
- SpringBoot2.1.6 整合CXF 实现Webservice
SpringBoot2.1.6 整合CXF 实现Webservice 前言 最近LZ产品需要对接公司内部通讯工具,采用的是Webservice接口.产品框架用的SpringBoot2.1.6,于是采用 ...
- ZooKeeper 系列(二)—— Zookeeper单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 1.2 解压 1.3 配置环境变量 1.4 修改配置 1.5 启动 1. ...
- 【入门】WebRTC知识点概览 | 内有技术干货免费下载
什么是WebRTC WebRTC 即Web Real-Time Communication(网页实时通信)的缩写,是一个支持网页浏览器之间进行实时数据传输(包括音频.视频.数据流)的技术.经过多年的发 ...
- 【设计模式】结构型01代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 定义:顾名思义,增加中间层,为其他对象提供一种代理以控制对这个对象的访问.核心在于代理二字. 1.和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理 ...
- yii中find()指定条件
find()查找指定的条件 $modelName::model->find(); 使用条件对象 $criteria = new CDbCriteria(); $criteria->sele ...
- Niginx简单的配置
#user nobody; #这里的数值不能超过 CPU 的总核数,因为在单个核上部署超过 1 个 Nginx 服务进程并不起到提高性能的作用.worker_processes 2; #nginx进程 ...
- 基于STM32之UART串口通信协议(一)详解
一.前言 1.简介 写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发 ...
- 透视BlueStore存储结构:如何根据文件名从裸盘提取文件内容
在FileStore下,用户文件经过切分对象块后最终存放在了单机文件系统(xfs .ext4等)中,我们可以较容易地找到这些对象块对应的文件,然后提取这些对象块文件后组装成用户文件.然而,BlueSt ...