poj 3254(状态压缩dp)

来源:互联网 发布:小意思托福 mac 编辑:程序博客网 时间:2024/06/04 08:58
#include <iostream>#include <cstdio>#include <cstring>#define MOD 100000000using namespace std;int n, m;int p;int state[1 << 12], pow[15];int Map[15];int dp[15][1 << 12];void Init() {int i;p = 0;pow[0] = 1;for(i = 1; i <= m; i++)pow[i] = pow[i - 1] * 2;for(i = 0; i < pow[m]; i++)if(!(i & (i << 1)))state[p++] = i;}int main() {int i, k, j, c;scanf("%d%d", &n, &m);Init();for(i = 1; i <= n; i++) {int num = 0;for(k = 1; k <= m; k++) {scanf("%d", &c);num += (pow[k - 1] * !c);}Map[i] = num;}for(i = 0; i < p; i++)if(!(state[i] & Map[1]))dp[1][i] = 1;for(i = 2; i <= n; i++)for(k = 0; k < p; k++)for(j = 0; j < p; j++)if(!(state[k] & state[j]) && !(state[k] & Map[i]))dp[i][k] = (dp[i][k] + dp[i - 1][j]) % MOD;int ans = 0;for(i = 0; i < p; i++)ans = (ans + dp[n][i]) % MOD;printf("%d\n", ans);return 0;}

0 0
原创粉丝点击