墙壁涂色问题-计蒜客(递归)

蒜头君觉得白色的墙面好单调,他决定给房间的墙面涂上颜色。他买了 3 种颜料分别是红、黄、蓝,然后把房间的墙壁竖直地划分成 n 个部分,蒜头希望每个相邻的部分颜色不能相同。他想知道一共有多少种给房间上色的方案。

例如,当 n = 5时,下面就是一种合法方案。

由于墙壁是一个环形,所以下面这个方案就是不合法的。

输入格式

一个整数 n,表示房间被划分成多少部分。(1≤n≤50)

输出格式

一个整数,表示给墙壁涂色的合法方案数。

样例输入

4

样例输出

18

 

这道题是一个典型的递推题目,从这道题中可以理解很多递推的本质思想。

1.假设函数:设f[n]为n个尺寸的墙有几种不同排序

2.递推的本质:用已知推未知:寻找前后项之间的关系,仔细思考n-1和n之间的关系,可以分为两种情况

     当第1项和第n-1项不同色时。第n项只有一种颜色可以取,即f[n]=f[n-1]

     当第1项和第n-1项同色时。第n项有两种颜色可以取,同时因为第n块和第n-1块不同色,所以f[n]=2*f[n-2]

由高中数学知识,分类相加,不难得到f[n] = f[n-1] + f[n-2]*2   (n>3)

     别忘了f[1]=3,f[2]=f[3]=6

long long paintWallCounts(int wallsize) {
    long long f[wallsize];
    f[wallsize];
    f[1] = 3; f[2] = 6; f[3] = 6;
    for(int i = 4; i <= wallsize; i++)
        f[i] = f[i-1] + 2*f[i-2];
    return f[wallsize];
}

 

你可能感兴趣的:(算法总结,水题)