【bzoj1019】汉诺塔
【bzoj1019】汉诺塔
题意
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1019
分析
思路1:待定系数+解方程
设\(f[n]\)为\(n\)个盘子的答案。
看似这么简单的设数方式!
我们大胆地猜想,它存在线性的递推式!
不难想到先模拟出前几项,然而用待定系数+解方程解出递推式(然而我最初并没有想到...),然后直接递推就OK了。
%%WJMZBMR
思路2:递推
设\(f[x][i]\)表示第\(x\)根柱子上有\(i\)个盘子的最少转移次数,以及转移到的柱子为\(g[x][i]\)
奠基:
\(f[x][1]\)根据优先级来求
\(g[x][1]=1\)
转移:当前已知\(f[?][i-1]\)和\(g[?][i-1]\)的答案,考虑求解\(f[x][i]\)和\(g[x][i]\)
设\(y=g[x][i-1],k=(1+2+3)-(x+y)\),即没有用的哪根柱子。第一步必然是将\(x\)的\(i-1\)个移到\(y\),接下来需要分类讨论。
①当\(g[y][i-1]=k\)时,我们选择这样的策略:
- 将\(x\)的\(i-1\)个移到\(y\)
- 将\(x\)的最后一个移到\(k\)
- 将\(y\)的\(i-1\)个移到\(k\)
得到:
\(f[x][i]=f[x][i-1]+1+f[y][i-1]\)
\(g[x][i]=k\)
②当\(g[y][i-1]=x\)时,我们选择这样的策略:
- 将\(x\)的\(i-1\)个移到\(y\)
- 将\(x\)的最后一个移到\(k\)
- 将\(y\)的\(i-1\)个移到\(x\)
- 将\(k\)的唯一一个移到\(y\)
- 将\(x\)的\(i-1\)个移到\(y\)
得到:
\(f[x][i]=f[x][i-1]+1+f[y][i-1]+1+f[x][i-1]\)
\(g[x][i]=y\)
为什么这样是正确的?
其实并不知道......
但好像汉诺塔一类的问题都是这样贪心就可以了。
小结
(1)汉诺塔一类的问题
知结论。
会递推。
会递归。
(2)一类待定系数法解决的问题
对于求\(f(n)\)这类的问题,我们可以大胆地猜想:它是线性的。
然后求解前几项,再解出来,然后就很容易了,最多结合个什么矩阵乘法之类的。
有时候不是线性的也可以解决啊。
例如\(f[i]=af[i-1]^2+bf[i-1]+c\),依然可以使用待定系数求解。
类似的问题:bzoj1002轮状病毒
【bzoj1019】汉诺塔的更多相关文章
- BZOJ1019 汉诺塔
定义f[i][j]为将i柱上的j个盘挪走(按优先级)的步数 p[i][j]为将i柱上的j个盘按优先级最先挪至何处 首先考虑一定p[i][j]!=i 设初始为a柱,p[i][j-1]为b柱 考虑两种情况 ...
- BZOJ1019 汉诺塔/洛谷P4285 [SHOI2008]汉诺塔
汉诺塔(BZOJ) P4285 [SHOI2008]汉诺塔 居然是省选题,还是DP!(我的DP菜得要死,碰见就丢分) 冥思苦想了1h+ \(\to\) ?! 就是普通的hanoi NOI or HNO ...
- 【BZOJ1019】[SHOI2008]汉诺塔(数论,搜索)
[BZOJ1019][SHOI2008]汉诺塔(数论,搜索) 题面 BZOJ 洛谷 题解 首先汉诺塔问题的递推式我们大力猜想一下一定会是形如\(f_i=kf_{i-1}+b\)的形式. 这个鬼玩意不好 ...
- bzoj1019 [SHOI2008]汉诺塔
1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1030 Solved: 638[Submit][Status] ...
- bzoj1019 / P4285 [SHOI2008]汉诺塔
P4285 [SHOI2008]汉诺塔 递推 题目给出了优先级,那么走法是唯一的. 我们用$0,1,2$代表$A,B,C$三个柱子 设$g[i][x]$为第$x$根柱子上的$i$个盘子,经过演变后最终 ...
- bzoj千题计划109:bzoj1019: [SHOI2008]汉诺塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1019 题目中问步骤数,没说最少 可以大胆猜测移动方案唯一 (真的是唯一但不会证) 设f[i][j] ...
- [bzoj1019][SHOI2008]汉诺塔 (动态规划)
Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操 ...
- 【bzoj1019】[SHOI2008]汉诺塔
1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1427 Solved: 872[Submit][Status] ...
- bzoj1019: [SHOI2008]汉诺塔(动态规划)
1019: [SHOI2008]汉诺塔 题目:传送门 简要题意: 和经典的汉诺塔问题区别不大,但是题目规定了一个移动时的优先级: 如果当前要从A柱子移动,但是A到C的优先级比A到B的优先级大的话,那就 ...
随机推荐
- MyBatis的返回参数类型和查询结果遍历
MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.result ...
- 求数组中的最小子数组,时间复杂度o(n),java
石家庄铁道大学 信1405-1 班 唐炳辉 题目:给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 设计思路:两个变量 ,一个记录当前并入的数组的值,另外一个记录所算过得最大的数组的值,当 ...
- #使用while循环输入1 2 3 4 5 6 8 9 10
#!/usr/bin/env python #使用while循环输入1 2 3 4 5 6 8 9 10 import time start = 1 while True: if start == 7 ...
- Java多个数字求和输出
设计思想: 首先为了能够输入数字,先引入一个类import java.util.Scanner;因为是多个数字求和,所以为了方便声明一个数组double[] num;再声明一个变量int number ...
- BZOJ 1413 取石子游戏(DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1413 题意:n堆石子排成一排.每次只能在两侧的两堆中选择一堆拿.至少拿一个.谁不能操作谁 ...
- getbyclass
其实以前我偷偷学习正则表达式的时候,写过一个getbyclass的方法,最近翻了翻到处都是错,或者好多重复的,没有用的 代码,于是显得没事我就把这个精简了一下,其实这个方法现在我觉得也是有问题的,问题 ...
- 【转载】创建和使用动态链接库 (C++)
原文:http://blog.csdn.net/handforcpp/article/details/3478254 也可参考MSDN: 演练:创建和使用动态链接库 (C++) 我们将创建的第一种类型 ...
- [HIHO119]网络流五·最大权闭合子图(最大流)
题目链接:http://hihocoder.com/contest/hiho119/problem/1 题意:中文题意. 由于1≤N≤200,1≤M≤200.最极端情况就是中间所有边都是满的,一共有N ...
- shape into blocks--source code in python based on pySpark
这是微博深度和广度预测的原始代码,写了大约半个月,第一个版本不是这样的,但是这个版本包含所有需要的功能. 模块化的程度也更高.找工作前一直想用python完美解决这个问题,后来发现自己的方法和硬件都有 ...
- python接口的调用方法
第一个图灵机器人接口实例: #!/usr/bin/env python # -*- coding: utf_8 -*- import urllib2,urllib import json import ...