ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

旗帜

2021-02-03 19:32:24  阅读:316  来源: 互联网

标签:白色 int 蓝色 样例 红色 旗帜 彩带


传送门已损坏

文章目录

题目描述

tigertang决定在二中九十校庆那天,用一些白色、蓝色和红色的彩带来装饰他的商店橱窗。他希望满足以下条件:
1.相同颜色的彩带不能放在相邻的位置。
2.一条蓝色的彩带必须放在一条白色的彩带和一条红色的彩带中间。
在这里插入图片描述
计算满足要求的放置彩带的方法数。

输入格式

一行,一个整数n,表示彩带的数目。

输出格式

装饰橱窗的可行方法数m。

输入样例

3

输出样例

4

数据范围

对30%的数据,1<=n<=15。
对100%的数据,1<=n<=45。

题目大意

给定三种颜色不同的彩带:白色、蓝色、红色。现在要求相邻的旗帜不能彩带,且蓝色彩带必须放在白色彩带和红色彩带的中间。试求放置 nn条彩带的合法方案总数。n≤45

解题思路

动态规划
设f[i]为i条彩带的合法方案数。
考虑第i-1条彩带如果为蓝色,当第i-2条彩带为白色,则第i条彩带为红色;当第i-2条彩带为红色,则第i条彩带为白色。换言之,若第i-1条彩带为蓝色,第i条彩带的颜色根据第i-2条彩带颜色而固定,此时方案数为f[i-2]。
考虑第i-1条彩带为白色或者红色,则第i条彩带的颜色一定为红色或者白色。此时方案数为f[i-1]。
综上,动态转移方程:f[i]=f[i-2]+f[i-1]

参考代码

在此附上本人的 AC代码,仅供参考,请勿抄袭:

#include<bits/stdc++.h>
using namespace std;
//const int maxn=1e6*2;
inline int read()
{
    char c=getchar();int x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;return x;
}
long long n,f[1001]={0,2,2};
int main()
{
	cin>>n;
	for(int i=3;i<=n;i++)
	{
		f[i]=f[i-1]+f[i-2];
	}
	cout<<f[n];
}

——————————QAQ

标签:白色,int,蓝色,样例,红色,旗帜,彩带
来源: https://blog.csdn.net/qq_46258139/article/details/113617807

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有