版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/85011350
Description
tigertang决定在一中九十校庆那天,用一些白色、蓝色和红色的彩带来装饰他的商店橱窗。他希望满足以下条件:
1.相同颜色的彩带不能放在相邻的位置。
2.一条蓝色的彩带必须放在一条白色的彩带和一条红色的彩带中间。
计算满足要求的放置彩带的方法数。
tle="1544783938325922.png" alt="11.png"/>
Input
一行,一个整数n,表示彩带的数目。
Output
装饰橱窗的可行方法数m。
3
-
Sample Input
4
-
Sample Output
HINT
对30%的数据,1<=n<=15。
对100%的数据,1<=n<=45。
一眼看出本质:动归.
蓝色要分两种情况.
#include <iostream>
#include <cstdio>
#define SIZE 50
using namespace std;
unsigned long long white[SIZE], blue_white[SIZE], blue_red[SIZE], red[SIZE]; // 到了n = 45时刚好爆int
int main(void)
{
int n, i;
white[0] = red[0] = 1;
scanf("%d", &n);
for (i = 1; i <= n; ++i)
{
white[i] = red[i-1]; // 考虑白色的情况
if (i > 1)
{
white[i] += blue_red[i-1]; // 白色可以接在前面是蓝色且前面的前面是红色方块的后面
}
red[i] = red[i-1]; // 考虑红色的情况
if (i > 1)
{
red[i] += blue_white[i-1]; // 红色可以接在前面是蓝色且前面的前面是白色的方块的后面
}
if ((i > 1) && (i < n)) // 不在最前或最后,可以放置蓝色方块
{
blue_red[i] = red[i-1]; // 蓝色,前一个位置是红色
blue_white[i] = white[i-1]; // 蓝色,前一个位置是白色
}
}
printf("%llu", white[n] + red[n]); // 最后一个位置是红色和白色的方案数加起来
return 0;
}