題目分析
**部分
今天小信裝修新家,給家裡買了一種 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 程式設計用遞迴的方法求解上述...