这题题意理解并不难,尽管想到是递推,但是还是好久才找到递推公式的。
从n-1分析到n似乎走不同,但是我们可以反过来,
先看第n位,由于O是个特殊的字母,所以我们以第n位是不是O来分类:
1、第n位是O:那么前一位只能是E,F,所以是在n-2所有合法字符串的种树乘2
2、第n位不是O:那么很简单,就是在n-1合法字符串上加上E或者F,所以是n-1长度字符串种树的两倍
综上所述,f[n] = 2 * (f[n-1]+f[n-2])
似乎这题还是Fabonacci数列的变种。
#include <stdio.h>
long long res[40];
long long solve(int n) {
if (res[n]) return res[n];
if (n == 1) return res[1] = 3;
if (n == 2) return res[2] = 8;
if (n > 2) return res[n] = solve(n - 2) * 2 + solve(n - 1) * 2;
}
int
main(int argc, char **argv) {
int n;
while (scanf("%d", &n) == 1) {
printf("%lld\n", solve(n));
}
return 0;
}