zoukankan      html  css  js  c++  java
  • 递推 + 高精度 --- Tiling

    Tiling
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 7264   Accepted: 3528

    Description

    In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles?
    Here is a sample tiling of a 2x17 rectangle.

    Input

    Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.

    Output

    For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle.

    Sample Input

    2
    8
    12
    100
    200

    Sample Output

    3
    171
    2731
    845100400152152934331135470251
    1071292029505993517027974728227441735014801995855195223534251


    【题目来源】
    The UofA Local 2000.10.14
    http://poj.org/problem?id=2506

    【题目大意】
    意思很简单,给你一块2*n的地板,问你使用1*2、2*2的瓷砖来铺有几种方法。

    【题目分析】
    看到样例就可以发现是高精度。
    首先,我们假设前2*(n-1)块地板已经铺好了,那么我们要铺到2*n就只有一种方法,就是使用1*2这一种瓷砖。
    假设前2*(n-2)块地板已经铺好了,那么我们要铺到2*n则有三种方法,也就是使用两块1*2,或者使用两块2*1,或者使用一块2*2,但是这其中有一种是包含在上面的
    方法中的,所以在递推的时候只能算2种。
    因此我们得到了我们的递推公式:
    f(1)=1;
    f(2)=1;
    f(3)=3;
    f(n)=f(n-1)+f(n-2)*2;

    剩下的就是实现的问题,高精度简单加法。

    ac代码:
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<bitset>
    #include<vector>
    #include<cmath>
    #include<stack>
    #include<queue>
    using namespace std;
    int ans[260][300];
    int main()
    {
        int n,i,j;
        while(scanf("%d",&n)!=EOF)
        {
            memset(ans,0,sizeof(ans));
            ans[0][0]=1;
            ans[1][0]=1;
            ans[2][0]=3;
            if(n<=2)
            {
                printf("%d
    ",ans[n][0]);
            }
            else
            {
                int temp=0;
                int s=0;
                for(i=3;i<=n;i++)
                {
                    for(j=0;j<300;j++)
                    {
                        s=ans[i-1][j]+ans[i-2][j]*2+temp;
                        ans[i][j]=s%10;
                        temp=s/10;
                    }
                }
                int flag=0;
                for(i=300;i>=0;i--)
                {
                   if(flag||ans[n][i])
                   {
                     flag=1;
                     printf("%d",ans[n][i]);
                   }
                }
                puts("");
            }
    
        }
        return 0;
    }



  • 相关阅读:
    动态图片 Movie android-gif-drawable GifView
    X5SDK 腾讯浏览器内核
    AS 自动生成选择器 SelectorChapek
    Genymotion 模拟器 VirtualBox
    360加固保 安全防护 多渠道打包
    Thread 如何安全结束一个线程 MD
    面试题 HashMap 数据结构 实现原理
    nGrinder3.4 性能测试框架安装
    java内存泄漏的定位与分析
    JVM总结-内存监视手段及各区域内存溢出解决
  • 原文地址:https://www.cnblogs.com/crazyacking/p/3730803.html
Copyright © 2011-2022 走看看