木块砌墙---解题报告
生活随笔
收集整理的這篇文章主要介紹了
木块砌墙---解题报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目詳情 #include?<cstdio> ?? #include?<string> ?? #include?<cstring> ?? ?? using?namespace?std;?? ?? #ifdef?WIN32 ?? #define?ll?__int64? ?? #else ?? #define?ll?long?long ?? #endif ?? ?? ?? int?stan?=?0,stak=?0;?? ll?f[3000][1<<6];?? ?? //將二進制轉成十進制 ?? ll?bit2int(int?bit[],?int?k)?? {?? ?? ????ll?i=1;?? ????ll?ans?=?bit[0];?? ????for?(i?=?1;?i?<?k?;i++)?? ????????ans?+=?bit[i]?*?(1<<i);?? ????return?ans;?? }?? ?? ?? ?? //十進制轉成2進制 ?? void?int2bit(int?bit[],?ll?num)?? {?? ????memset(bit,0,sizeof(bit));?? ????ll?i;?? ????for?(i?=?0;?num?!=?0?;?i++)?? ????{?? ?? ????????bit[i]?=?num?%?2;?? ????????num/=2;?? ????}?? }?? ?? ?? ll?all?=?0;?? //計算從上往下到第x行(包含上邊所有行)?以x狀態為y?時?的每種一種放法特例所得到的f(x-1,h),加到all上去?? void?count(ll?x,int?bit[],ll?n,int?bit2[]);?? ?? ?? //計算從上往下到第x行(包含上邊所有行)?以x狀態為y?時的方法總數 ?? int?dp(ll?x,ll?y)?? {?? ????if?(x?==?1?&&?y?==?(1<<stak?)-1)?return?0;?? ????if?(x?==?0)?return?1;?? ????if?(f[x][y]?!=?0)?return?f[x][y];//已經計算過了?? ????all?=?0;?? ?? ?? ????//第x行的2進制表示 ?? ????int?bit[6];?? ????int2bit(bit,y);?? ?? ?? ????//第x-1行的2進制表示 ?? ????int?bit2[6];?? ????memset(bit2,0,sizeof(bit2));?? ?? ????//計算 ?? ????count(x,bit,0,bit2);?? ????return?(f[x][y]?=?all);?? }?? ?? //第x行,從第0到n位的都放過了 ?? void?count(ll?x,int?bit[],ll?n,int?bit2[])?? {?? ????//遞歸邊界 ?? ????if?(n>=stak)?? ????{?? ????????//將得到的bit2[]轉成狀態h,就可以得到f(x-1,h).?加到?all上面去 ?? ????????all?=?(all?+?dp(x-1,bit2int(bit2,stak)))??%?1000000007?;?? ????????return?;?? ????}?? ????//這位被占了,那么這位不能放東西,且x-1的這位,必然是0 ?? ????if?(bit[n]?==?1)?? ????{?? ????????bit2[n]=0;?? ????????count(x,bit,n+1,bit2);?? ????}?? ????//如果這位是空的,那么3種方塊都有可能放 ?? ????else?? ????{?? ????????//放1*1*1 ?? ?????????bit2[n]?=?0;?? ?????????count(x,bit,n+1,bit2);?? ?????????//放2*1*1 ?? ?????????bit2[n]?=?1;?? ?????????count(x,bit,n+1,bit2);?? ?????????//放1*2*2?條件是這一位置不是最后一位,且下一位置可以放 ?? ?????????if?(n<stak?&&?bit[n+1]?==?0?)?? ?????????{?? ?? ?????????????bit2[n]?=?0;?? ?????????????bit2[n+1]?=?0;?? ?????????????count(x,bit,n+2,bit2);?? ?????????}?? ?? ????}?? ?? ?? }?? ?? int?calculate(int?n,int?k)??? {?? ????stak?=?k;?? ????stan?=?n;?? ????memset(f,0,sizeof(f));?? ????return?dp(2*n,0);?? }?? ?? ?? //start?提示:自動閱卷起始唯一標識,請勿刪除或增加。? ?? int?main()?{?? ????//自行定義n,k ?? ?? ???int?n,k;?? ???//為了調試,實際提交要去掉這行 ?? ???while(1)?? ???{?? ???????scanf("%d%d",&n,?&k);?? ???????printf("%d\n",calculate(n,k));?? ???}?? ???? ????return?0;?? }?? //end?//提示:自動閱卷結束唯一標識,請勿刪除或增加。?? 結束語: 這題有種直覺,可以更簡單。。沒多考慮,直接這么寫了。。。有更好方法的朋友,留個言!
用 1×1×1, 1× 2×1以及2×1×1的三種木塊,
搭建K × 2^N × 1的墻,不能翻轉、旋轉(0<=N<=1024,1<=K<=5)
有多少種方案,輸出結果對1000000007取模。
舉例:
舉個例子如給定N=1 K=2
答案是7,如下圖所示
總結
以上是生活随笔為你收集整理的木块砌墙---解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件过程-喷泉模型和统一过程模型RUP
- 下一篇: 轻击鼠标,实现完美分区