蒜头君觉得白色的墙面好单调,他决定给房间的墙面涂上颜色。他买了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; }数量重要,质量更重要,不要急,不要图快,慢慢来稳扎稳打,就是最快的速度