蓝桥杯递推--墙壁涂色

    科技2022-07-10  114

    题目:

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

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

    蓝红黄红黄

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

    蓝红黄红蓝

    Input 一个整数t,表示数据的组数。(1≤t≤100)

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

    Output t个整数,表示每组给墙壁涂色的合法方案数。

    Sample Input 1

    1 4 Sample Output 1

    18

    总结反思: 1.以后再有这种先给出了f[1] f[2] f[3]…的题型,就要想一想是不是可以像斐波那契数列那样可以有规律的推倒呢 2.这种题其实就是纯数学题,分情况讨论,看看倒数第二个位置和第一个位置的颜色是不是相等:     (1)相等的话,倒数第一个有两种选择 2 * f(n-2)     (2)不想等,倒数第一个位置就只有一种可能 f(n-1) 两种情况并不相交,这样总的次数就等于 f(n) = 2 * f(n-2) + f(n-1) 3.递推和递归还是有区别的,递推是推倒一个通用的公式,如果能通过公式来求结果,绝不去用递归,递归的时间效率太低了。

    上代码:

    #include"iostream" using namespace std; long long f[51]; int main(){ int t; cin >> t; f[1] = 3; f[2] = 6; f[3] = 6; for(int i = 4;i <= 50;i ++){ f[i] = f[i-1] + f[i-2]*2; } while(t--){ int n; cin >> n; cout << f[n] << endl; } return 0; }

    数量重要,质量更重要,不要急,不要图快,慢慢来稳扎稳打,就是最快的速度

    Processed: 0.082, SQL: 8