題解 鋪瓷磚

2021-09-25 23:44:15 字數 1961 閱讀 1387

題目分析

**部分

今天小信裝修新家,給家裡買了一種 1×2的長方形(如圖1)新瓷磚。小信是個懂得審美的人,畢竟人生除了金錢,還有詩和遠方。這個時候小信就在想,這種長方形的瓷磚鋪到乙個 n×m 的地面上有多少種方案(如圖2:是 4×4 地面的一種方案)?

輸入兩個整數 n,m,(1≤min(n,m)≤10, 1≤max(n,m)≤100)。

輸出方案總數(最後結果模 10^9 + 7)。

sample input 1

2 2sample output 1

2這道題的資料與題幹很明顯就會聯想到狀態壓縮(或狀壓dp)。

狀壓dp

狀壓dp實際就是暴力列舉,時間空間消耗少,將狀態壓縮存進int型別中,比如可以處理一些麻煩的題,細節麻煩的問題中。用例子來講,01揹包i,j就是時態的個更新,主要的還是二進位制的問題,『0』表示不選,『1』反之。連成串後再轉成十進位制數。

運算子在之前寫過一篇運算子的概括,單目運算子,雙目運算子,三目運算子都有,大家可一去看一下:

對於狀壓dp,這還是把運算子都列舉出來:

&       與運算   

| 或運算

^ 異或運算

! 非運算(求補)

>> 右移運算

<< 左移運算

1       &       1       ==       1   

1 & 0 == 0

0 & 1 == 0

0 & 0 == 0

1       |       1       ==       1   

1 | 0 == 1

0 | 1 == 1

0 | 0 == 0

1       ^       1       ==       0   

1 ^ 0 == 1

0 ^ 1 == 1

0 ^ 0 == 0

檢查第i位是否有1:

if(1<<(i-1)&x)...
檢查第i位是否有0:

if(1<<(i-1)&x==0)...
統計x中有多少個 1:

while(x)
檢查中是否有相鄰的 1:

if(x&(x<<1))...
計算x最低位1代表的值:

intlowbit(intx)
把第i位取反:

x^= (1<<(i-1))
在這裡我就不多說了 ,我給乙個比較簡單的列題(01揹包),用狀態dp

//01揹包狀壓暴力列舉

#include using namespace std;

int w[35], c[35];

int n, m;

int count_value(int x)//x存狀態

} return c;

}int main()

return true;

}int main()

for(int i=1;i}

} }cout

}

瓷磚鋪放(遞迴)

1 問題描述2 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?3 例如,長度為4的地面一共有如下5種鋪法 4 4 1 1 1 15 4 2 1 16 4 1 2 17 4 1 1 28 4 2 29 程式...

藍橋杯演算法題解 歷屆試題 瓷磚鋪放

題目描述 問題描述 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?例如,長度為4的地面一共有如下5種鋪法 4 1 1 1 1 4 2 1 1 4 1 2 1 4 1 1 2 4 2 2 程式設計用遞迴的方...

演算法訓練 瓷磚鋪放

問題描述 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?例如,長度為4的地面一共有如下5種鋪法 4 1 1 1 1 4 2 1 1 4 1 2 1 4 1 1 2 4 2 2 程式設計用遞迴的方法求解上述...