问题描述:
有一面长度为n(n<=10000)的墙,如果要将每单位长度的墙涂上红、绿、篮其中的一种颜色,而且红色墙右边不能紧邻绿色的墙,绿色的墙右边不能紧邻蓝色的墙,请问有几种涂色的方法?
0代表红色,1代表绿色,2代表蓝色
初始值F(1, 0) = F(1, 1) = F(1, 2) = 1;
状态转移方程:
for(n>1)
F(n, 0) = F(n-1, 0)+F(n-1, 1)+F(n-1, 2)
F(n, 1) = F(n-1, 1)+F(n-1, 2)
F(n, 0) = F(n-1, 0)+F(n-1, 2)
下边两种代发原理是相同的,一种采用无记录的方式,另外采用一种有记录的方式:
方法一:无记录
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
long long f(int n, int c, long long *p)
{
if (n == 1 && c == 0)
return 1;
if (n == 1 &a