[bzoj1019]:[SHOI2008]汉诺塔
来源:互联网 发布:软件无线电 军用 编辑:程序博客网 时间:2024/05/22 06:20
传送门
我只能说,乍一看题解好简单,结果看了一个多小时。。
就是f[x][i]代表从x到g[x][i]的最小步数
然后dp
具体的我不会讲
可以看这个,这个有图:
http://blog.163.com/suicidal_tomato/blog/static/2344980402014918104434888/
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define ll long longusing namespace std;inline int read(){ int x=0;char ch=' ';int f=1; while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar(); if(ch=='-')f=-1,ch=getchar(); while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return x*f;}ll n,f[4][31],g[4][31];int main(){ n=read(); for(int i=1;i<=6;i++){ char ch[4]; scanf("%s",ch); int a=ch[0]-'A'+1,b=ch[1]-'A'+1; if(!g[a][1])g[a][1]=b; } for(int i=1;i<=3;i++)f[i][1]=1; for(int i=2;i<=n;i++) for(int a=1;a<=3;a++){ int b=g[a][i-1],c=6-a-b; if(g[b][i-1]==c)f[a][i]=f[a][i-1]+1+f[b][i-1],g[a][i]=c; else f[a][i]=f[a][i-1]+1+f[b][i-1]+1+f[a][i-1],g[a][i]=b; } printf("%lld",f[1][n]); return 0;}
阅读全文
0 0
- bzoj1019: [SHOI2008]汉诺塔 dp
- BZOJ1019: [SHOI2008]汉诺塔
- 【bzoj1019】[SHOI2008]汉诺塔
- BZOJ1019 [SHOI2008]汉诺塔
- [BZOJ1019][SHOI2008]汉诺塔
- [BZOJ1019][SHOI2008]汉诺塔
- bzoj1019: [SHOI2008]汉诺塔
- 【bzoj1019】[SHOI2008]汉诺塔
- bzoj1019 [SHOI2008]汉诺塔
- bzoj1019: [SHOI2008]汉诺塔
- BZOJ1019: [SHOI2008]汉诺塔
- [BZOJ1019][SHOI2008]汉诺塔
- bzoj1019: [SHOI2008]汉诺塔
- [bzoj1019]:[SHOI2008]汉诺塔
- [BZOJ1019][SHOI2008]汉诺塔(递推)
- [递推] BZOJ1019: [SHOI2008]汉诺塔
- [bzoj1019][递推]汉诺塔
- BZOJ1019
- JAVA基础--关于Socket编程中的I/O阻塞
- 1031. 查验身份证(15) PAT乙级真题
- map
- 排列问题-c语言代码实战
- MyEclipse下Maven的安装配置
- [bzoj1019]:[SHOI2008]汉诺塔
- 【贪心算法】田忌赛马问题代码和注释
- 二叉树的应用——表达式树的原理分析与实现(Java语言)
- http://www.cnblogs.com/hadoop-dev/p/6908660.html
- Linux下Tomcat调优实战
- win系统下nodejs安装及环境配置
- UDOO NEO,NXP imx6 linux 开发板,上电开机
- 反码求和校验: 一个数加上自己取反得到的数正是时钟轮盘上最大那个数
- oreacle12c的安装配置使用plsql登录