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个盘子都有两种搬法:

  1. 方法一

  2. 方法二

我们知道每次最大盘的代价直接就是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(记忆化搜索)的更多相关文章

  1. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  2. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

  3. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  4. zoj 3644(dp + 记忆化搜索)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...

  5. loj 1044(dp+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...

  6. DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects

    题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...

  7. HDU1978 记忆化搜索

    How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  8. bzoj4562: [Haoi2016]食物链--记忆化搜索

    这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞 题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路 从入读为零的点进行记忆化搜索,搜到出度为零的点返回1 所有 ...

  9. 数位dp/记忆化搜索

    一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an  ...

随机推荐

  1. MSYS2开发环境搭建(无幻的博客,编译OpenSSL,可使用pacman升级)

    MSYS2开发环境搭建 软件安装 下载msys2-x86_64软件包,双击安装到某根目录下,比如D:\msys64. pacman是MSYS2自带的软件管理工具: 可通过修改msys64\etc\pa ...

  2. MJPhotoBrowser 用法

    一.使用方法:   #import "MJPhotoBrowser.h" #import "MJPhoto.h"   - (void)tapPhoto:(UIT ...

  3. CMake编译Qt程序+UI+Resources

    今天给大家讲解一下Cmake如何编译Qt程序. 这里说的Qt程序不只是用QtCreator写出来的程序,当然也可以是文本编辑器….这里说的Qt程序是指,QCoreApplication,QApplic ...

  4. ACM竞赛中的魔方问题专题(不定时更新)

    魔方有6个面,有24中不同的旋转方式: 一般有两种方法: (一):以1面为顶面,向右旋转0,90,180,270度 以2面为顶面,向右旋转0,90,180,270度 ... 以6面为顶面,向右旋转0, ...

  5. JS数据结构第三篇---双向链表和循环链表之约瑟夫问题

    一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地 ...

  6. Django 你需要掌握的模型层(标签、过滤器、模板的继承与导入)

    Django 模型层(标签.过滤器.模板的继承与导入) 好文章来自超哥:https://www.cnblogs.com/guanchao/p/11006062.html   过滤器/自定义过滤器 模板 ...

  7. 【Dubbo】Dubbo+ZK基础入门以及简单demo

    参考文档: 官方文档:http://dubbo.io/ duboo中文:https://dubbo.gitbooks.io/dubbo-user-book/content/preface/backgr ...

  8. (数据科学学习手札63)利用pandas读写HDF5文件

    一.简介 HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式,文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个H ...

  9. [python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project

    cmd安装 pip install tensorflow 1.遇到了 ERROR: Cannot uninstall 'wrapt'. It is a distutils installed proj ...

  10. LNet代码分析

    源码版本:lustre-release 2.15.55 介绍 LNet是Lustre的网络模块,代码目录分为了lnet和lnd lnet提供了统一的接口 lnd封装了底层驱动,有socklnd(TCP ...