令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;
}