#187-[动态规划]旗帜

版权声明:反正也没有人会转,下一个 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;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/85011350