Ural 1225 Flags

11 篇文章 0 订阅

题意:有n个格子,对这n个格子进行上色,上色要遵循两个规则,(1)相同颜色不能相邻 (2)蓝色两边必须一边为红色一边为白色,判断n个格子有多少种上色方法

链接:http://acm.timus.ru/problem.aspx?space=1&num=1225

思路:递推,可以证明满足斐波那契数列的性质

注意点:无

以下为AC代码:

IDDateAuthorProblemLanguageJudgement resultTest #Execution timeMemory used
6238332 21:00:12
6 May 2015
luminous111225. FlagsG++ 4.9 C++11Accepted 0.031370 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值