BZOJ1019 汉诺塔/洛谷P4285 [SHOI2008]汉诺塔
汉诺塔(BZOJ)
P4285 [SHOI2008]汉诺塔
居然是省选题,还是DP!(我的DP菜得要死,碰见就丢分)
冥思苦想了1h+ \(\to\) ?!
就是普通的hanoi NOI or HNOI? DP加上一个乱搞的数组,然后我还写反了一次,就gg了。
大概思路:
\(dp_{i,j}\)表示从柱子i移动j个盘子的最优解,\(f_{i,j}\) 表示从柱子i移动j个盘子到哪个柱子最优。然后就可以转移了!
先把i-1个盘子从x移到 \(y=f_{x,i-1}\) ,设另一根为z,然后分类:
1.\(f_{y,i-1}=y\),直接舍掉,不用DP了。
2.\(f_{y,i-1}=z\),那么把i-1个盘子从x移到y,把第i个移到z,然后把y上的i-1个移到z。
\(dp_{x,i}=dp_{x,i-1}+1+dp_{y,x-1},f_{i,j}=z\)
3.\(f_{y,i-1}=x\),把i-1个盘子先从x移到z,再把第i-1个从y移到x,再把z上的第i个移到y,再把x上i-1个的移到y
\(dp_{x,i}=dp_{x,i-1}+1+dp_{y,i-1}+1+dp_{x,i-1},f_{i,j}=y\)
最后 \(dp_{1,n}\) 就是答案
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=35;
char s[5];
int n;
int dp[N][N],f[4][N],from[7],to[7];
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=6;++i)
{
scanf("%s",s);
from[i]=s[0]-'A'+1,to[i]=s[1]-'A'+1;
}
for(int i=6;i>=1;--i)f[from[i]][1]=to[i];
dp[1][1]=dp[2][1]=dp[3][1]=1;
for(int i=2;i<=n;++i)
{
for(int j=1;j<=3;++j)
{
int x=j,y=f[x][i-1],z=6-x-y;
if(f[y][i-1]==z)
{
dp[x][i]=dp[y][i-1]+1+dp[x][i-1];
f[x][i]=z;
}
if(f[y][i-1]==x)
{
dp[x][i]=dp[y][i-1]+1+dp[x][i-1]+1+dp[x][i-1];
f[x][i]=y;
}
}
}
printf("%lld\n",dp[1][n]);
return 0;
}
BZOJ1019 汉诺塔/洛谷P4285 [SHOI2008]汉诺塔的更多相关文章
- bzoj1019 / P4285 [SHOI2008]汉诺塔
P4285 [SHOI2008]汉诺塔 递推 题目给出了优先级,那么走法是唯一的. 我们用$0,1,2$代表$A,B,C$三个柱子 设$g[i][x]$为第$x$根柱子上的$i$个盘子,经过演变后最终 ...
- 洛谷P1242 新汉诺塔(dfs,模拟退火)
洛谷P1242 新汉诺塔 最开始的思路是贪心地将盘子从大到小依次从初始位置移动到目标位置. 方法和基本的汉诺塔问题的方法一样,对于盘子 \(i\) ,将盘子 \(1\to i-1\) 放置到中间柱子上 ...
- P4285 [SHOI2008]汉诺塔 题解 (乱搞)
题目链接 P4285 [SHOI2008]汉诺塔 解题思路 提供一种打表新思路 先来证明一个其他题解都没有证明的结论:\(ans[i]\)是可由\(ans[i-1]\)线性递推的. (\(ans[i] ...
- 洛谷P1282 多米诺骨牌 (DP)
洛谷P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中 ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- P4285 [SHOI2008]汉诺塔
题目描述 汉诺塔由三根柱子(分别用A.B.C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操作是指:从一根 ...
- 洛谷 P1242 新汉诺塔
原题链接 题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号.将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A.B.C,这个状态称为初始状态. 现在要求找到一种步数最少的移动方案 ...
- 洛谷P1242 新汉诺塔
传送门啦 首先要将第n个盘子从x到y,那么就要把比n小的盘子全部移到6-x-y,然后将n移到y 仔细想想:6代表的是3根初始柱,3根目标柱. 6-(x+y) 便是我们的中转柱了,因为到这个位置是最优的 ...
- 洛谷P1242 新汉诺塔 【神奇的递归】
题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号.将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A.B.C,这个状态称为初始状态. 现在要求找到一种步数最少的移动方案,使得从初 ...
随机推荐
- IDEA 查看某个class的maven引用依赖&如何展示Diagram Elements
1.打开对应的class,如下图所示,至于具体快捷键就不说了,我是设置的eclipse的快捷键: 2.定位到对应jar,记下jar名称及版本: 3.在右侧栏点击maven,再在展出的视图中找到对应的m ...
- Spring注解@Qualifier、@Autowired、@Primary
@Qualifier 1.当一个接口有多个实现类,且均已注入到Spring容器中了,使用@AutoWired是byType的,而这些实现类类型都相同,此时就需要使用@Qualifier明确指定使用那个 ...
- Java--对象与类(二)
final 实例域 可以将实例域定义为final.构建对象时必须初始化这样的域.也就是说在一个构造器执行之后,这个域被设置,并且之后无法对其修改 final 修饰符大多应用于基本(primitive) ...
- python学习第一课
第一课: 1.不要使用来路不明的软件 2.下载杀毒软件 3.不懂技术的人在技术人面前会显得愈发无知 4.python无所不能 需要掌握的知识: 1.python基本语法 2.文件处理 3.函数 4.模 ...
- Systemverilog for design 笔记(一)
转载请标明出处 一. System Verilog 声明的位置 1. 包(packages) Verilog要求局部声明: variables, nets, tasks and f ...
- Day11 - L - 邂逅明下 HDU - 2897
当日遇到月,于是有了明.当我遇到了你,便成了侣.那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废话)小t和所有世俗的人们一样,期待那百年难遇的日食.驻足 ...
- 大数据萌新的Python学习之路(一)
笔记开始简介 从2018年9月份正式进入大学的时代,大数据和人工智能的崛起让我选择了计算机专业学习数据科学与大数据技术专业,接触的第一门语言就是C语言,后来因为同学推荐的原因进入了学校的人工智能研究协 ...
- UniGUI的SQLite数据库(04)
1]放FDConnection1和FDQuery1到界面上 一定要 放一个 FDPhysSQLiteDriverLink1到ServerModule上 2]在OnFormCreate事件里写 FDQ ...
- 让AUTOIT自动帮我更新文件服务器上的一些常用软件
要解决的问题: 一个朋友的公司(上班时间员工均无外网)最近全部员人都安装上了360安全卫士,补丁在局域网内升级...但360主程序在没有外网的情况下是不能升级的.....需要朋友经常去 ...
- 使用SourceTree的注意事项
1.我使用SourceTree时,使用的下面的配置全局忽略: *~ .DS_Store xcuserdata 2. 远程仓库的url路径不要使用域名,而应该使用ip地址.否则会显示“这是一个无效的ur ...