有排成一行的n個方格,用紅(Red)、粉(Pink)、綠(Green)三色塗每個格子,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的塗法.
遞推公式:
A1 = 3
A2 = 6 //A(3,2)=6
A3 = 6 //A(3,3)=6
An=2*A(n-2)+A(n-1), n>=4
證明:
考慮第n-1個格子:
1. 如果這個格子和第1個格子顏色不同,那麼第n個格子只有1種選擇,前n-1個格子的選擇就是A(n-1),此時n個格子的選擇是1*A(n-1)
2. 如果這個格子和第1個格子顏色相同,那麼第n個格子只有2種選擇,前n-2個格子的選擇就是A(n-2),此時n個格子的選擇時2*A(n-2)
所以有An=2*A(n-2)+A(n-1), n>=4
remak: 因爲我們是考慮第n-1個格子,該格子和第1個格子的顏色可能相同也可能不同,所以n>=4纔可以。不然n=3的話,第n-1=3-1=2個格子和第一個格子的顏色必然不同了,就沒有上面這2種情況了,所以要從n>=4開始推導。
具體題目可參見HDUOJ 2045題,代碼如下:
#include <iostream>
#include <iomanip>
#include <cmath>
#define PI 3.1415927
using namespace std;
long long func(int n) {
long long num[51]={0};
num[0]=3;
num[1]=6;//A(3,2)
num[2]=6;//A(3,3)
for(int i=3; i<n; i++) {//for n=i, condition on (i-1)th color
num[i]=num[i-1]+2*num[i-2];
}
return num[n-1];
}
int main()
{
int n;
while(cin >> n) {
cout << func(n) << endl;
}
return 0;
}