poj 2506 Tiling 递推
题目链接:
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 }
本文为博主原创文章,未经博主允许不得转载。