杭電oj——不容易系列之(3)—— LELE的RPG難題——【題解】

 題目鏈接:不容易系列之(3)—— LELE的RPG難題

思路:列出前面幾項觀察下規律,    a[1] = 3, a[2] = 6, a[3] = 6; 
按照一般的思路,找塗n個方格的方法數,可以看塗n-1個方格的方法數,然後塗第n個方格多了多少種方法
根據題中“要求任何相鄰的方格不能同色,且首尾兩格也不同色 ”可知
當n大於等於4時,第1格到第n-1格(大於等於3)纔不是相鄰的
思路來源:塗好了前n-1格的基礎上塗第n格,保證第1格和第n格顏色不同,且第n-1格與第n格顏色不同
    所以需要去分類討論第1格和第n-1格的顏色是否相同 
所以得到一個討論的條件:(當n大於等於4時)(總共有3種顏色) 
1.第1格與第n-1格同色時,塗第n格可以有2種方法,此時滿足第1格與第n格顏色不同,第n-1格與第n格顏色不同
  而此時塗前n-1格的方法數實際上只是塗前n-2格的方法數(第1格與第n-1格同色),所以有2*a[n-2]種方法。
2.第1格與第n-1格不同色時,塗第n格只能有1種方法,此時滿足第1格與第n格顏色不同,第n-1格與第n格顏色不同
  而此時塗前n-1格的方法數爲a[n-1]
所以塗前n格的方法數爲a[n]=a[n-1]+2*a[n-2]

所以第一種爲2*a[i-2]

2.當n=1與n=n-1不同,那麼而此時塗前n-1格的方法數爲a[n-1];

AC代碼:

#include <iostream>
using namespace std;
int main(){
	long long a[60];//用long long存取,因爲當n較大時數會很大,保險起見
	int n;
	a[1] = 3;
	a[2] = 6;
	a[3] = 6;
	while(cin >> n){
		for(int i = 4; i <= n; i++){
			a[i] = a[i - 1] + 2*a[i - 2];
		}
		cout << a[n] << endl;
	}
	return 0;
}

 

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