题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1019
分析:http://blog.sina.com.cn/s/blog_76f6777d0101b8l1.html 这里讲得比较清楚。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cassert>
using namespace std;
#define clr(a,x) memset(a,(x),sizeof(a));
#define rep(i,a,b) for(int i=(a);i<(b);++i)
#define rrep(i,a,b) for(int i=a;i>=b;--i)
#define LL long long
const int maxn=30+5;
LL f[3][maxn];
int g[3][maxn];
int from[7],to[7];
int main()
{
int n; cin>>n;
rep(i,0,6) {
char s[5]; scanf("%s",s);
from[i]=s[0]-'A';
to[i]=s[1]-'A';
}
f[0][1]=f[1][1]=f[2][1]=1;
rep(i,0,3) {
rep(j,0,6) {
if(from[j]==i) { g[i][1]=to[j]; break; }
}
}
rep(i,2,n+1) {
rep(x,0,3) {
int y=g[x][i-1];
int z=0+1+2-x-y;
if(g[y][i-1]==z) f[x][i]=f[x][i-1]+1+f[y][i-1],g[x][i]=z;
else f[x][i]=f[x][i-1]+1+f[y][i-1]+1+f[x][i-1],g[x][i]=y;
}
}
printf("%lld\n",f[0][n]);
}