题目地址:POJ 3254
状压水题。
先预处理出每行所有可能出现的情况。然后可以用vector存起来。
然后先处理出第一行所有的情况。然后再从第二行开始不断与上一行进行状态转移,状态转移很简单就不说了。
最后统计出最后一行的个数和就可以了。
代码如下;
#include #include #include #include #include #include #include #include #include using namespace std; #define LL __int64 const int mod=100000000; const int INF=0x3f3f3f3f; int a[20][20]; int dp[3][1<<13]; vector vec[13]; bool Judge(int x, int y, int m) { int i; for(i=0; i 0&&(j&(1< =mod) dp[i&1][tmp]%=mod; } } if(i==n-1) { ans+=dp[i&1][tmp]; if(ans>=mod) ans%=mod; //printf("%d\n",ans); } } } if(n==1) { ans=vec[0].size(); } printf("%d\n",ans); return 0; }