题意:有n个格子,对这n个格子进行上色,上色要遵循两个规则,(1)相同颜色不能相邻 (2)蓝色两边必须一边为红色一边为白色,判断n个格子有多少种上色方法
链接:http://acm.timus.ru/problem.aspx?space=1&num=1225
思路:递推,可以证明满足斐波那契数列的性质
注意点:无
以下为AC代码:
ID | Date | Author | Problem | Language | Judgement result | Test # | Execution time | Memory used |
---|---|---|---|---|---|---|---|---|
6238332 |
21:00:12
6 May 2015 | luminous11 | 1225. Flags | G++ 4.9 C++11 | Accepted | 0.031 | 370 KB |
/*
***********************************************
*# @Author : Luminous11 (573728051@qq.com)
*# @Date : 2015-05-06 23:05:15
*# @Link : http://blog.csdn.net/luminous11
***********************************************
*/
#include <bits/stdc++.h>
#define clr(a, v) memset( a , v , sizeof(a) )
using namespace std;
const double eps = 1e-10;
const double pi = acos(-1.0);
struct Bignum{
string s;
void init( string _s ){s=_s;}
friend Bignum operator + ( const Bignum &a, const Bignum &b ){
string l, r;
l = a.s;
r = b.s;
string ans;
int len = max ( l.size(), r.size() );
int p1 = l.size() - 1;
int p2 = r.size() - 1;
int tmp = 0;
for ( int i = 0; i < len; i ++ ){
int x, y;
if ( p1 >= 0 )
x = l[p1] - '0';
else
x = 0;
if ( p2 >= 0 )
y = r[p2] - '0';
else
y = 0;
ans.push_back ( ( x + y + tmp ) % 10 + '0' );
tmp = ( x + y + tmp ) / 10;
p1 --;p2 --;
}
if ( tmp )ans.push_back ( tmp + '0' );
reverse ( ans.begin(), ans.end() );
Bignum rtn;
rtn.init( ans );
return rtn;
}
void print ()
{
cout << s << endl;
}
};
int main()
{
// ios::sync_with_stdio ( false );
// Bignum num[55];
// num[1].init ( "2" );num[2].init( "2" );
// for ( int i = 3; i < 55; i ++ ){
// num[i] = num[i-1] + num[i-2];
// }
// int n;
// while ( scanf ( "%d", &n ) != EOF ){
// num[n].print();
// }
int n;
long long dp[50];
dp[1] = 2LL;
dp[2] = 2LL;
for ( int i = 3; i < 50; i ++ ){
dp[i] = dp[i-1] + dp[i-2];
}
while ( cin >> n ){
cout << dp[n] << endl;
}
return 0;
}