您的位置:首页 > 其它

poj 2506 Tiling 递推

2014-12-18 17:20 375 查看
题目链接:

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

题目描述:

  有2*1和2*2两种瓷片,问铺成2*n的图形有多少种方法?

解题思路:

  利用递推思想,2*n可以由2*(n-1)的状态加上一块竖放2*1的瓷片转移得来,也可以由2*(n-2)的状态加上一块2*2的瓷片或者加上两块横放的2*1的瓷片转移得来。

可得出递推公式:dp
= dp[n-1] + dp[n-2]*2;

ac秘诀:

  (1):从输出样例可以看出要用大数来表示,大概需要90位左右。

  (2):2*0不是零种方法吗?经过无数次wa,证明是一,竟然是一!!!!!!!,也是醉了,苦苦思索了良久··········。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
#define maxn 90
int dp[251][maxn], a[maxn];

int main ()
{
int n, i, j;
memset (dp, 0, sizeof(dp));
dp[0][0] = 1;
dp[1][0] = 1;
dp[2][0] = 3;
for (i=3; i<251; i++)//打标,储存所有的结果
{
int yu = 0;
for (j=0; j<maxn; j++)//大数运算
{
int s = dp[i-2][j]*2 + yu + dp[i-1][j];
dp[i][j] = s % 10;
yu = s / 10;
}
}
while ( scanf ("%d", &n) != EOF)
{
i = maxn - 1;
while (dp
[i] == 0)//除去前导零
i--;
for (; i >=0; i--)
printf ("%d", dp
[i]);
printf ("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: