生活随笔
收集整理的這篇文章主要介紹了
UVa 10359 - Tiling
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:給你一個2*n的地面,用1*2和2*2的地板磚鋪滿,有多少種不同方案。
分析:組合數學,動態規劃。直接找到地推關系求解。
? ? ? ? ? ? 因為,只可能是最后一列是一個整體(1種情況)或者最后兩列是一個整體(兩種情況);
? ? ? ? ? ? 所以,有遞推公式:f(n)= f(n-1)+ 2*f(n-2);
? ? ? ? ? ? 可以使用動態規劃或母函數(an = (pow(2,n+1)-pow(-1,n+1))/ 3)求解。
說明:大整數運算,這里采用dp求解,貌似快速冪會快點╮(╯▽╰)╭。
[cpp]?view plaincopyprint?
#include?<algorithm>?? #include?<iostream>?? #include?<cstdlib>?? #include?<cstring>?? #include?<cstdio>?? #include?<cmath>?? ?? using?namespace?std;?? ?? int?ans[255][101],two[101];?? ?? void?copy_array(int?*a,?int?*b)?? {?? ????for?(int?i?=?0;?i?<?100;?++?i)?? ????????a[i]?=?b[i];?? }?? ?? void?add_array(int?*c,?int?*a,?int?*b)?? {?? ????for?(int?i?=?0;?i?<?100;?++?i)?? ????????c[i]?=?0;?? ????for?(int?i?=?0;?i?<?100;?++?i)?{?? ????????c[i]?+=?a[i]+b[i];?? ????????if?(c[i]?>?9)?{?? ????????????c[i+1]?+=?c[i]/10;?? ????????????c[i]?%=?10;??? ????????}?? ????}?? }?? ?? void?output_array(int?*a)?? {?? ????int?end?=?100;?? ????while?(end?&&?!a[end])?--?end;?? ????while?(end?>=?0)?printf("%d",a[end?--]);?? ????printf("\n");?? }?? ?? int?main()?? {?? ????memset(ans,?0,?sizeof(ans));?? ????ans[0][0]?=?1;ans[1][0]?=?1;?? ????for?(int?i?=?2;?i?<?252;?++?i)?{?? ????????add_array(two,?ans[i-2],?ans[i-2]);?? ????????add_array(ans[i],?ans[i-1],?two);?? ????}?? ?????? ????int?n;?? ????while?(~scanf("%d",&n))?? ????????output_array(ans[n]);?? ?????? ????return?0;?? } ?
總結
以上是生活随笔為你收集整理的UVa 10359 - Tiling的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。