染色問題(n個格子,3種顏色)

有排成一行的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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章