记录一个菜逼的成长。。
一道状态压缩DP入门的题。学习下状压DP。
题目大意:
给你一个n*m的图。为0不能放羊,为1可以放羊,一个格子只能放一只羊,并且不能有羊相邻的情况有多少种。
状态压缩就是将状态用一个十进制数来表示,十进制数用二进制表示就可以表示状态,所以会用到位运算。
dp[i][j]:=第i行状态为j的方案数;
对于可以放羊的位置,如果放羊则为1,不放则为0;
样例第一行有8种情况,分别为 000,001,010,100,011(不符),101,110(不符),111(不符)
第二行有两种情况,分别为000,010
而010这种情况又跟第一行的010冲突,所以对于000情况又5种,对于010有4种,加起来是9种。
所以判断的时候不仅要判断同行相邻,还要判断与上一行相邻的情况。
对于样例,m = 3,所以将状态压缩为8.即1<<3。在二进制下有三位,可以用来表示状态。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <list>
#include <stack>
#include <deque>
#include <cctype>
#include <bitset>
#inc