码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2506 Tiling【高精度】【递推】

时间:2015-04-18 10:05:13      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://poj.org/problem?id=2506


题目大意:

有一个大小2*N的矩形地板,用规格为2*2和2*1的瓷砖方块去填满它,共有多少种方案


思路:

设长度为N的矩形地板共有F[N]种方案。共有三种放法:

先放一块2*2瓷砖方块,则F[N] = F[N-2]。

先放两块横着的1*2的瓷砖,则F[N] = F[N-2]。

先放一块竖着的2*1的瓷砖,则F[N] = F[N-1]。

总和一下,就是:F[N] = F[N-1] + 2*F[N-2]。

因为0 <= N <= 250,所以要用到高精度。用整型数组F[][]来计算,然后用字符型数组Fi[][]

来存储结果。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 300;
const int MAXNLEN = 400;

int F[MAXN][MAXNLEN];
char Fi[MAXN][MAXNLEN];

void Solve()
{
    F[0][0] = 1;
    F[1][0] = 1;
    for(int i = 2; i <= 250; ++i)
    {
        for(int j = 0; j <= 350; ++j)
        {
            F[i][j] = F[i][j] + F[i-1][j] + F[i-2][j] + F[i-2][j];
            if(F[i][j] >= 10)
            {
                F[i][j+1] += F[i][j]/10;
                F[i][j] %= 10;
            }
        }
    }
    for(int i = 0; i <= 250; ++i)
    {
        int j;
        for(j = 350; j >= 0; --j)
            if(F[i][j] == 0)
                continue;
            else
                break;
        int k = 0;
        for(; j >= 0; --j)
            Fi[i][k++] = F[i][j] + '0';
        Fi[i][k] = '\0';
    }
//    for(int i = 0; i <= 50; ++i)
//        cout << Fi[i] << endl;
}

int main()
{
    Solve();
    int N;
    while(cin >> N)
    {
        cout << Fi[N] << endl;
    }
    return 0;
}


POJ2506 Tiling【高精度】【递推】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45110651

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!