HDOJ-2045 不容易系列之(3)—— LELE的RPG難題(遞推)
阿新 • • 發佈:2018-11-11
題目:HDOJ-2045
題目描述:
有排成一行的n個方格,用紅(Red)、粉(Pink)、綠(Green)三色塗每個格子,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的塗法.
思路:(遞推)
這個和 高中數學 學排列組合時遇到的相鄰塗色問題類似,思路都一樣。
第n個方格的顏色取決於第n-1個和第1個方格的顏色。
①當第1個和第n-1個顏色不同,前n-1個合法,而n此時只能填1種顏色,所以該情況等於1 * f(n-1)
(例如 前n-1個:R . . . P,那麼n只能是G)
②當第1個和第n-1個顏色相同,前n-1個不合法,但n只要和他們顏色不同就可以合法了(n有2種選擇)。
這個時候發現前n-2個是肯定合法的(第n-1個顏色隨第1個改變,而第n-2個和第n-1個顏色一定不同,那麼第n-2個和第1個顏色也肯定不同),
所以該情況等於2 * f(n-2)
綜上所述:f(n)=f(n-1)+2*f(n-2)
以下AC程式碼:
#include<iostream>
using namespace std;
int main()
{
long long f[51];
int i, n;
f[1] = 3;
f[2] = 6;
f[3] = 6;
for (i = 4; i <= 50; i++)
f[i] = f[i - 1] + 2 * f[i - 2];
while (cin>>n)
{
cout << f[n] << endl;
}
return 0;
}