poj 1185(状压dp)
和TSP一样经典的dp问题。
dp[i][S_pre][S_now]表示表示当前在i行状态诶S_now,上一行状态为S_pre的最大摆放个数。
对于合法的转移有:
dp[i][S_pre][S_now]=max(dp[i][S_pre][S_now],dp[i-1][S_pre_pre][S_pre]+num[i]);
总结一下棋盘类dp的一般步骤(纯属个人yy):
1.初始化合法状态
2.初始化地图
3.初始化dp数组(memset,第一行。。。)
4.状态转移
5.统计答案
注意:0/1串中0,1到底表示什么
多说一句:今晚国足加油!!!(′?ω?)?
#include#include #include #include using namespace std; int n,m; int dp[102][100][100],cur[102],num[100],st[100],st_sum; char map[102][12]; inline bool ok(int x) { return !((x&(x<<1))|(x&(x<<2))); } inline int count(int x) { int cnt=0; while (x) { if (x&(-x)) ++cnt; x-=(x&(-x)); } return cnt; } int main() { // freopen("poj 1185.in","r",stdin); while (~scanf("%d%d",&n,&m)&&(n||m)) { st_sum=0; for (int i=0;i<(1<