poj2506 Tiling
http://poj.org/problem?id=2506
题目大意:用多少种方法可以用2*1或2*2瓦片来铺一个2*n的矩形?
这是一个2*17长方形的样品。
输入是一行行的序列,每一行包含一个整数0 <= n <= 250。对于每一行输入,在单独的行中输出一个整数,给出一个2 * n矩形的可能摆放方式数。
也就是说给一个2*n的棋盘,用三种方块(2*2,1*2,2*1)将其铺满,求有多少种可能性,通过给出的案例可以发现,输出的结果很大long long类型也存不下,所以要运用大整数的加法。作图可以发现递归方程式,对2 * 1,2 * 2,2 * 3来说 2 * 1有1种;2 * 2有3种;2 * 3 可以在2 * 2 的基础上加一个2 * 1竖着放的瓦片,在 2 * 1 的基础上加一个2 * 2的瓦片,也可以加两个2 * 1横着放的瓦片(竖着放与在 2 * 2的基础上重复)。num[3] = num[2]+ 2 * num[1]
算法思想:递归求解,这里采用一次性计算的迭代法提高算法的效率。我们可以发现递归的方程式:
1)num[i] = num[i - 1]+ 2 * num[i - 2]; i>2
2)num[0] = 1 ; i=0
3)num[1] = 1 ; i=1
4)num[2] = 3 ; i=2
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 string Add(string str1, string str2)//大整数加法(两个正整数) 5 { 6 string str; 7 int len1 = str1.length(); 8 int len2 = str2.length(); 9 if (len1 < len2) //前面补0,使两个字符串长度相同 10 { 11 for (int i = 1; i <= len2 - len1; i++) 12 str1 = "0" + str1; 13 } 14 else 15 { 16 for (int i = 1; i <= len1 - len2; i++) 17 str2 = "0" + str2; 18 } 19 len1 = str1.length(); 20 int cf = 0;//进位 21 int temp;//当前位的值 22 for (int i = len1 - 1; i >= 0; i--) 23 { 24 temp = str1[i] - '0' + str2[i] - '0' + cf; 25 cf = temp / 10; 26 temp %= 10; 27 str = char(temp + '0') + str; 28 } 29 if (cf != 0) str = char(cf + '0') + str; 30 return str; 31 } 32 int main() 33 { 34 string num[251] = { "1","1","3" }; 35 for (int i = 3; i <= 250; i++) 36 { 37 num[i] = Add(num[i - 1], Add(num[i - 2], num[i-2])); 38 } 39 int temp; 40 while (cin >> temp) { 41 cout << num[temp] << endl; 42 } 43 return 0; 44 }
作 者: Angel_Q
出 处:http://www.cnblogs.com/DA799422035/
关于作者:如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步