bzoj1019: [SHOI2008]汉诺塔
dp.
用g[x][i]代表第x根柱子的i个原盘会到哪个柱子,f[x][i]代表所用步数。
则根据g[x][i-1]和g[g[x][i-1]][i-1]就能知道搬运的过程是怎样的。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; char p[7][3]; int g[40][3],n; long long f[40][3]; int main() { scanf("%d",&n); for(int i=1;i<=6;i++) scanf("%s",p[i]); for(int i=1;i<=3;i++) for(int j=1;j<=6;j++) if(p[j][0]-'A'+1==i) { f[i][1]=1; g[i][1]=p[j][1]-'A'+1; break; } for(int i=2;i<=n;i++) for(int x=1,y,z;x<=3;x++) { y=g[x][i-1]; z=6-y-x; f[x][i]=f[x][i-1]+1; if(g[y][i-1]==z) { f[x][i]+=f[y][i-1]; g[x][i]=z; } else { f[x][i]+=f[y][i-1]+1+f[x][i-1]; g[x][i]=y; } } printf("%lld\n",f[1][n]); return 0; }