BZOJ 1019: [SHOI2008]汉诺塔
令G[i][0/1/2]表示1~i号盘最终会被统一叠到第几号柱子
F[i][0/1/2]表示1~i号盘最终被叠起来的步数
规则是确定的,那么转移也是确定的
i从i-1转移过来
分类讨论一下
难度在于认识到所有东西都是确定的
#include<cstdio> using namespace std; int G[35][3]; long long F[35][3]; char s[5]; int main(){ int n; scanf("%d",&n); for (int i=0; i<3; i++) F[1][i]=1,G[1][i]=-1; for (int i=0; i<6; i++){ scanf("%s",s); int l=s[0]-'A',r=s[1]-'A'; if (G[1][l]==-1) G[1][l]=r; } for (int i=2; i<=n; i++) for (int x=0; x<3; x++){ int y=G[i-1][x],z=3-x-y; if (G[i-1][y]==x){ G[i][x]=y; F[i][x]=F[i-1][x]+1+F[i-1][y]+1+F[i-1][x]; } else{ G[i][x]=z; F[i][x]=F[i-1][x]+1+F[i-1][y]; } } printf("%lld\n",F[n][0]); return 0; }