蓝桥杯递推--墙壁涂色

题目:

蒜头君觉得白色的墙面好单调,他决定给房间的墙面涂上颜色。他买了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;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rabbit Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值