Description
On the Day of the Flag of Russia a shop-owner decided to decorate the show-window of his shop with textile stripes of white, blue and red colors. He wants to satisfy the following conditions:
- Stripes of the same color cannot be placed next to each other.
- A blue stripe must always be placed between a white and a red or between a red and a white one.
Determine the number of the ways to fulfill his wish.
Example. For
N = 3 result is following:
Input
N, the number of the stripes, 1 ≤
N ≤ 45.
Output
M, the number of the ways to decorate the shop-window.
Sample Input
input | output |
---|---|
3 | 4 |
思路:
一开始想自己写规律的,但是规律题我几乎都不能用手画出来,所以想了一会儿,还是暴力吧,因为数据不大。
找规律代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
using namespace std;
#define T 10005
#define inf 0x3f3f3f3f
#define lson (rt<<1)
#define rson (rt<<1|1)
typedef long long ll;
int f,cnt,v[100];
void dfs(int c)
{
if(c==f){cnt++;return;}
for(int i=0;i<3;++i){
if((c==0||c==f-1)&&i==1)continue;
if(c==0)v[c] = i;
else if(v[c-1]==i||
(c>0&&c<f&&i==1&&v[c-1]==v[c+1])){
continue;
}
v[c]=i;
dfs(c+1);
}
}
int main()
{
#ifdef zsc
freopen("input.txt","r",stdin);
#endif
int n,i,j,k,t;
f = 3;
for(f=1;f<=45;++f){
memset(v,-1,sizeof(v));
cnt = 0;
dfs(0);
printf("%d\n",cnt);
}
return 0;
}
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
using namespace std;
#define T 10005
#define inf 0x3f3f3f3f
#define lson (rt<<1)
#define rson (rt<<1|1)
typedef long long ll;
int main()
{
#ifdef zsc
freopen("input.txt","r",stdin);
#endif
int i,j,k,n;
ll v[100];
v[1] = 2,v[2] = 2;
for(i=3;i<=45;++i){
v[i] = v[i-1]+v[i-2];
}
while(~scanf("%d",&n))
{
printf("%lld\n",v[n]);
}
return 0;
}