POJ 3254 Corn Fields 状态压缩DP
2014-06-02 12:11
369 查看
题目链接
状态压缩,先将所有没有相邻的1的状态预处理一遍,存在一个数组中
状态转移关系:dp[i][j]表示考虑到当前第i行时,状态为j的摆放总数,可以由dp[i-1][k]转移得到,其中满足:状态j为a[i]的子集,状态k为a[i-1]的子集,状态j与状态k匹配
集合S是集合T的子集等价于:S & ~T == 0
状态压缩,先将所有没有相邻的1的状态预处理一遍,存在一个数组中
状态转移关系:dp[i][j]表示考虑到当前第i行时,状态为j的摆放总数,可以由dp[i-1][k]转移得到,其中满足:状态j为a[i]的子集,状态k为a[i-1]的子集,状态j与状态k匹配
集合S是集合T的子集等价于:S & ~T == 0
/*AC*/ #include <cstdio> #include <iostream> #include <cstring> using namespace std; #define MOD 100000000 int sta[1<<12], a[12], dp[2][1<<12], n, m, num; //用滚动数组 void init(){ num = 0; int sum = 1<<m; for(int i=0; i<sum; i++) if(i & (i<<1)) continue; //保证每一行没有两个相邻的1 else sta[num++]=i; } bool fit(int x, int y){ if((x & y) == 0) return 1; //保证相邻的两行没有相邻的1 else return 0; } void DP(){ for(int i=0; i<num; i++) if(fit(sta[i],~a[0])) //sta[i]是a[0]的子集 dp[0][i]=1; for(int i=1;i<n;i++){ memset(dp[i%2], 0, sizeof(dp[i%2])); //计算当前第i行时要将原来第i-2行的旧数据擦除掉,否则用滚动数组会WA for(int j=0;j<num;j++) if(fit(sta[j],~a[i])){ //sta[j]是a[i]的子集 for(int k=0;k<num;k++){ if(fit(sta[k], ~a[i-1]) && fit(sta[k],sta[j])) //sta[k]是a[i-1]的子集,状态k和状态j匹配 dp[i%2][j]=(dp[i%2][j]+dp[(i-1)%2][k])%MOD; } } } int ans=0; for(int i=0;i<num;i++) ans=(ans+dp[(n-1)%2][i])%MOD; printf("%d\n",ans); } int main(){ int tem; scanf("%d %d", &n, &m); memset(a, 0, sizeof(a)); for(int i=0; i<n; i++) for(int j=0; j<m; j++){ scanf("%d", &tem); if(tem == 1) a[i] += 1<<(m-j-1); //原矩阵中的每一行压缩,用二进制表示 } init(); DP(); return 0; }
相关文章推荐
- POJ 3254 Corn Fields(状态压缩DP)
- POJ 3254 Corn Fields(DP + 状态压缩)
- POJ 3254 Corn Fields (状态压缩DP)
- poj 3254 Corn Fields (状态压缩dp)
- POJ 3254 Corn Fields (状态压缩DP)
- POJ-3254 Corn Fields 入门级状态压缩DP
- poj 3254 Corn Fields (状态压缩dp)
- 状态压缩DP-Corn Fields(POJ 3254)
- POJ 3254 Corn Fields状态压缩DP
- POJ 3254 Corn Fields 状态压缩DP
- POJ-3254 Corn Fields 状态压缩DP+滚动数组
- POJ 3254 Corn Fields(状态压缩DP)
- poj 3254 Corn Fields (状态压缩DP)
- POJ 3254 Corn Fields 状态压缩dp
- poj 3254 Corn Fields(状态压缩dp)
- poj-3254-Corn Fields-状态压缩DP
- POJ 3254 Corn Fields 状态压缩DP
- Poj - 3254 Corn Fields (状态压缩dp入门第一题(详解
- POJ 3254 Corn Fields (状态压缩DP)
- POJ3254——Corn Fields(状态压缩DP)