传送门
我只能说,乍一看题解好简单,结果看了一个多小时。。
就是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 long
using 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;
}