BZOJ 1019: [SHOI2008]汉诺塔
Description
一个汉诺塔,给出了移动的优先顺序,问从A移到按照规则移到另一个柱子上的最少步数.
规则:小的在大的上面,每次不能移动上一次移动的,选择可行的优先级最高的.
Sol
DP.
倒着DP.但是他有优先级,所以他的方案是唯一的.
状态 \(f[a][i]\) 表示 将 \(a\) 柱上的 \(i\) 个移到,能移动到的柱子上的步数.
他能移动到的柱子也是唯一的,这个可以跟DP一起递推出来.
\(g[a][j]\) 表示 将 \(a\) 柱上的 \(i\) 个能移动到的柱子.
然后就开始递推了,跟普通汉诺塔一样,把 \(i-1\) 个先移走,然后移动第 \(i\) 个盘子,显然他只能移动到 \(i-1\) 移动到的另一个柱子,然后考虑把 \(i-1\) 个一回来,这时候就有问题了.. \(i-1\) 个在优先级的影响下可能会回到原位置,这时候就不能把这些一共 \(i\) 个盘子移到 \(i\) 所在的柱子了,所以只能将 \(i\) 移到 \(i-1\) 一开始移动到的那个柱子.
结果就是 \(f[1][n]\) .
时间复杂度 \(O(n)\)
Code
/**************************************************************
Problem: 1019
User: BeiYu
Language: C++
Result: Accepted
Time:0 ms
Memory:1288 kb
****************************************************************/ #include<cstdio>
#include<iostream>
using namespace std; #define debug(a) cout<<#a<<"="<<a<<" "
const int N = 35; int n,b[3];
int g[3][N];
long long f[3][N]; int main(){
scanf("%d",&n);
for(int i=1;i<=6;i++){
char fr=getchar();while(fr>'Z' || fr<'A') fr=getchar();
char to=getchar();while(to>'Z' || to<'A') to=getchar();
if(!b[fr-'A']) b[fr-'A']=1,g[fr-'A'][1]=to-'A',f[fr-'A'][1]=1;
}
for(int i=2;i<=n;i++){
for(int a=0,b,c;a<3;a++){
b=g[a][i-1],c=3-a-b;
if(g[b][i-1] == c) f[a][i]=f[a][i-1]+1+f[b][i-1],g[a][i]=c;
if(g[b][i-1] == a) f[a][i]=f[a][i-1]+1+f[b][i-1]+1+f[a][i-1],g[a][i]=b;
}
}cout<<f[0][n]<<endl;
return 0;
}
BZOJ 1019: [SHOI2008]汉诺塔的更多相关文章
- BZOJ 1019: [SHOI2008]汉诺塔( dp )
dp(x, y)表示第x根柱子上y个盘子移开后到哪根柱子以及花费步数..然后根据汉诺塔原理去转移... ------------------------------------------------ ...
- BZOJ 1019 :[SHOI2008]汉诺塔(递推)
好吧蒟蒻还是看题解的 其实看到汉诺塔就该想到是递推了 设f[i][j]表示i个在j杆转移到另一个杆的次数 g[i][j]表示i个在j杆转移到那个杆上 可得 f[i][j]=f[i-1][j]+1+f[ ...
- 【BZOJ 1019】 1019: [SHOI2008]汉诺塔 (DP?)
1019: [SHOI2008]汉诺塔 Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一 ...
- 1019: [SHOI2008]汉诺塔
1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1495 Solved: 916[Submit][Status] ...
- 【BZOJ】1019: [SHOI2008]汉诺塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1019 题意:汉诺塔规则,只不过盘子n<=30,终点在B柱或C柱,每一次移动要遵守规则:1.小的 ...
- bzoj千题计划109:bzoj1019: [SHOI2008]汉诺塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1019 题目中问步骤数,没说最少 可以大胆猜测移动方案唯一 (真的是唯一但不会证) 设f[i][j] ...
- bzoj1019 [SHOI2008]汉诺塔
1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1030 Solved: 638[Submit][Status] ...
- 【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的优先级大的话,那就 ...
随机推荐
- Java学习笔记2
package welcome; public class Constants { public static void main(String[] args){ final double CM_PE ...
- PetaPoco 使用总结(二)
接着上一篇,上一篇主要介绍了PetaPoco 基本情况,优缺点和基本的查询功能,所以这篇主要介绍的是PetaPoco 的增,删,改等功能.PetaPoco提供了完整的增,删,改,查功能.是代替SqlH ...
- Hibernate整合C3P0实现连接池
Hibernate整合C3P0实现连接池 hibernate中可以使用默认的连接池,无论功能与性能都不如C3PO(网友反映,我没有测试过),C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI ...
- Linq_Lambda GroupBy使用笔记
今天看MVC遇到了GroupBY的Lambda表达式..有兴趣详细的看下去..得此笔记..记录之... 不罗嗦..上代码... //得到List<GroupEmail>对象 数据源 var ...
- svn强制解锁的几种做法
标签: svn强制解锁 2013-12-16 17:40 12953人阅读 评论(0) 收藏 举报 分类: SoftwareProject(23) 版权声明:本文为博主原创文章,未经博主允许不得转 ...
- axure新手入门教程
首先做个声明:此次教程里为了快速完成,借用了一些网上已有教程的图文,不是剽窃,只图方便.另外,因为汉化版本可能功能名称等略有差别,请自行理解. 名词解释: 线框图:一般就是指产品原型,比如:把线框图尽 ...
- 用java实现zip压缩
本来是写到spaces live上的,可是代码的显示效果确实不怎么好看.在javaeye上试了试代码显示的顺眼多了. 今天写了个用java压缩的功能,可以实现对文件和目录的压缩. 由于java.uti ...
- 新浪微博客户端(63)-使用block进行链式编程
Person.h #import <Foundation/Foundation.h> @interface Person : NSObject - (Person *(^)())study ...
- H5 使用
关闭页面 http://www.bcty365.com/content-146-3343-1.html 回退页面: plus.key.addEventListener('backbutton', fu ...
- R语言学习笔记
向量化的函数 向量化的函数 ifelse/which/where/any/all/cumsum/cumprod/对于矩阵而言,可以使用rowSums/colSums.对于“穷举所有组合问题" ...