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,证明是一,竟然是一!!!!!!!,也是醉了,苦苦思索了良久··········。
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; }
相关文章推荐
- POJ 2506 Tiling(递推+大整数加法)
- POJ 2506 Tiling (递推+高精度)
- poj 2506 Tiling——递推和大数模拟
- POJ 2506 Tiling (递推 + 大数加法模拟 )
- POJ 2506 Tiling(高精度+递推)
- poj 2506 Tiling(大数+递推)
- POJ 2506 Tiling (大数+递推)
- poj 2506 Tiling 【大数加递推】
- POJ 2506 Tiling ( 递推 + 大数 )
- poj 2506 Tiling 《大数加法+递推》
- Poj 2506 Tiling (Java高精度 + 递推)
- POJ - 2506 Tiling (递推+高精度运算)@
- POJ训练计划2506_Tiling(递推)
- POJ2506——Tiling(高精度+递推)
- [ACM] POJ 2506 Tiling (递推,大数)
- poj 2506 Tiling(递推 大数)
- poj 2506 Tiling【大数+递推】
- poj - 2506 Tiling--递推
- poj 2506 Tiling(数学:递推+高精度)
- poj 2506 Tiling dp 递推