1. 程式人生 > >HDOJ-2045 不容易系列之(3)—— LELE的RPG難題(遞推)

HDOJ-2045 不容易系列之(3)—— LELE的RPG難題(遞推)

題目: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; }