poj 1038 Bugs Integrated, Inc. __dp状态压缩
来源:互联网 发布:iphone丢失后抹掉数据 编辑:程序博客网 时间:2024/06/03 19:58
题目简述:
一个生产芯片的工厂要生产一种规格为2*3的芯片,方法是先生产一块规格为n*m的矩形硅片,由n*m个正方形方块组成,但是硅片上存在一些损坏的方块,显示为黑色,它们不能用来制作芯片。现在给出硅片上每个损坏方块的位置,求用该硅片最多能切割出多少块芯片。
思路:
为什么要用3进制来状态压缩呢,其实可以看成两个二进制结合而来的,如果题目改成只能横着放那就可以用二进制表示第i行第j个可用或不可用,如果题目改成只能竖着放那就可以用二进制表示第i行第j个和第i-1行第j个都可用或都不可用;把这两者结合起来就是一个三进制的数了。
接下来看代码:
#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>const int maxn = 152;const int tri[11] = {1 ,3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049};using namespace std;int dp[2][59049], pre[12], now[12], mp[maxn][12];int v = 0, n, m;int getten(int* a) { int result = 0, i; for (i = 0; i < m; i++) result += a[i] * tri[i]; return result;}void getthree(int k, int* a) { int i; for(i = 0; i < m; i++) { a[i] = k % 3; k /= 3; }}void dfs(int j, int k, int ss) { dp[v^1][k] = max(dp[v^1][k], ss); if (j >= m - 1) return; int kk; if (!pre[j] && !pre[j+1] && !now[j] && !now[j+1]) { now[j] = 2; now[j+1] = 2; kk = getten(now); dfs(j+2, kk, ss + 1); now[j] = 0; now[j+1] = 0; } if (j < m - 2 && !now[j] && !now[j+1] && !now[j+2]) { now[j] = 2; now[j+1] = 2; now[j+2] = 2; kk = getten(now); dfs(j+3, kk, ss + 1); now[j] = 0; now[j+1] = 0; now[j+2] = 0; } dfs(j+1, k, ss); // 这里很重要,意思是跳过这一块;}int main() { int k, D, i, j, t; scanf("%d", &D); while (D--) { memset(mp, 0, sizeof(mp)); memset(dp[v], -1, sizeof(dp[v])); scanf("%d%d%d", &n, &m, &k); int x, y; while (k--) { scanf("%d%d", &x, &y); mp[x-1][y-1] = 1; } for(i = 0; i < m; i++) pre[i] = mp[0][i] + 1; int tmp = getten(pre); dp[v][tmp] = 0;//初始状态是可行的; for(i = 1; i < n ; i++) { memset(dp[v^1], -1, sizeof(dp[v^1])); for(j = 0; j < tri[m]; j++) { if (dp[v][j] == -1) continue;//这个状态没有; getthree(j, pre); for(t = 0; t < m; t++) if (mp[i][t]) now[t] = 2; else now[t] = max(0, pre[t] - 1); dfs(0, getten(now), dp[v][j]); } v ^= 1; } int result = 0; for(i = 0; i < tri[m]; i++) if (result < dp[v][i]) result = dp[v][i]; cout<<result<<endl; } return 0;}
阅读全文
0 0
- poj 1038 Bugs Integrated, Inc. __dp状态压缩
- poj 1038 Bugs Integrated, Inc. __dp状态压缩
- poj 1038 - Bugs Integrated, Inc.(状态压缩dp)
- 状态压缩dp POJ 1038 Bugs Integrated, Inc.
- POJ 1038 Bugs Integrated, Inc. 状态压缩DP
- poj 1038 Bugs Integrated, Inc.(动态规划状态压缩)
- CEOI 2002, POJ 1038 Bugs Integrated, Inc. 状态压缩 DP
- poj 1038 Bugs Integrated, Inc. 状态压缩dp
- 1038 Bugs Integrated, Inc.//状态压缩DP
- POJ--1038--Bugs Integrated, Inc.--状态DP
- poj 1038 Bugs Integrated, Inc.
- POJ 1038 Bugs Integrated, Inc.
- poj 1038 Bugs Integrated, Inc.
- poj 1038 Bugs Integrated, Inc.
- POJ 1038 Bugs Integrated, Inc.
- POJ 1038 Bugs Integrated, Inc.
- POJ 1038 Bugs Integrated, Inc. 状态压缩dp+3进制枚举
- 【DP,状态压缩】PKU-1038-Bugs Integrated, Inc.
- poj 2411 Mondriaan's Dream (状态dp)
- 中国电子商务需要什么样的风控系统
- Android问题:真机运行程序报错:com.android.ddmlib.AdbCommandRejectedException: device unauthorized. This adb ser
- Linux系统(Centos)下安装nodejs并配置环境
- 再谈java乱码:GBK和UTF-8互转尾部乱码问题分析
- poj 1038 Bugs Integrated, Inc. __dp状态压缩
- 正则表达式
- JAVA Lang包下常用的工具类
- android动画介绍--Animation实现loading动画效果
- Java内存区域与内存溢出异常(jdk 6,7,8)
- 面试OR笔试32——滑动窗口最大值
- UEFI 设置从新增的ssd启动:修改Windows Boot Manager的device属性
- 数组下标重载
- 基于TextRank的关键词提取算法