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

poj 2506 Tiling 递推

时间:2014-12-18 18:42:19      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   sp   for   div   

题目链接:

  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[n] = dp[n-1] + dp[n-2]*2;

ac秘诀:

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

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

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <iostream>
 5 using namespace std;
 6 #define maxn 90
 7 int dp[251][maxn], a[maxn];
 8 
 9 int main ()
10 {
11     int n, i, j;
12     memset (dp, 0, sizeof(dp));
13     dp[0][0] = 1;
14     dp[1][0] = 1;
15     dp[2][0] = 3;
16     for (i=3; i<251; i++)//打标,储存所有的结果
17     {
18         int yu = 0;
19         for (j=0; j<maxn; j++)//大数运算
20         {
21             int s = dp[i-2][j]*2 + yu + dp[i-1][j];
22             dp[i][j] = s % 10;
23             yu = s / 10;
24         }
25     }
26     while ( scanf ("%d", &n) != EOF)
27     {
28         i = maxn - 1;
29         while (dp[n][i] == 0)//除去前导零
30             i--;
31         for (; i >=0; i--)
32             printf ("%d", dp[n][i]);
33         printf ("\n");
34     }
35     return 0;
36 }

 

poj 2506 Tiling 递推

标签:style   blog   http   io   color   os   sp   for   div   

原文地址:http://www.cnblogs.com/alihenaixiao/p/4172204.html

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