POJ 1038 Bugs Integrated, Inc. 状态压缩DP

题目来源:1038 Bugs Integrated, Inc.

题意:最多能放多少个2*3的矩形

思路:状态压缩DP啊 初学 看着大牛的代码搞下来的  总算搞懂了 接下来会更轻松吧

3进制代表前2行的状态(i行和i-1行)1代表i-1行占位 2代表i行占位 i-1不管有没有占位都不会影响的0代表i行和i-1行都空闲

然后枚举状态dfs更新状态 话说就不能没写深搜了 有点不会了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[2][60000];
int a[155][12];
int b[115][12];
int n, m;

int get(int k)
{
	int ans = 0;
	for(int i = m-1; i >= 0; i--)
	{
		ans *= 3;
		ans += b[k][i];
	}
	return ans;
}

int get2(int x, int k)
{
	for(int i = 0; i < m; i++)
	{
		b[k][i] = x%3;
		x /= 3;
	}
}
void dfs(int l, int i, int x)
{

	dp[l][get(1)] = max(dp[l][get(1)], x);
	//printf("***%d", dp[l][get(1)]);
	if(i >= m)
		return;

	if(i < m-2 && !b[1][i] && !b[1][i+1] && !b[1][i+2])
	{
		//puts("sfa");
		b[1][i] = b[1][i+1] = b[1][i+2] = 2;
		dfs(l, i+3, x+1);
		b[1][i] = b[1][i+1] = b[1][i+2] = 0;
	}
	if(i < m-1 && !b[1][i] && !b[1][i+1] && !b[0][i] && !b[0][i+1])
	{
		//puts("dfs");
		b[1][i] = b[1][i+1] = 2;
		dfs(l, i+2, x+1);
		b[1][i] = b[1][i+1] = 0;
	}
	dfs(l, i+1, x);
}
int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		memset(a, 0, sizeof(a));
		int k;
		scanf("%d %d %d", &n, &m, &k);
		int s = 1;
		for(int i = 0; i < m; i++)
			s *= 3;
		for(int i = 0; i < k; i++)
		{
			int x, y;
			scanf("%d %d", &x, &y);
			a[--x][--y] = 1;
		}
		memset(dp, -1, sizeof(dp));

		for(int i = 0; i < m; i++)
		{
			b[0][i] = a[0][i] + 1;
		}
		dp[1][get(0)] = 0;
		int l = 1, r = 0;

		for(int i = 1; i < n; i++)
		{
			l ^= 1;
			r ^= 1;
			memset(dp[l], -1, sizeof(dp[l]));
			for(int j = 0; j < s; j++)
			{
				if(dp[r][j] == -1)
					continue;
				get2(j, 0);
				for(int t = 0; t < m; t++)
				{
					if(a[i][t])
						b[1][t] = 2;
					else
						b[1][t] = b[0][t]-1;
					if(b[1][t] < 0)
						b[1][t] = 0;
				}
				dfs(l, 0, dp[r][j]);
			}
		}
		int ans = 0;
		for(int i = 0; i < s; i++)
			ans = max(ans, dp[l][i]);
		printf("%d\n", ans);
	}
	return 0;
}

POJ 1038 Bugs Integrated, Inc. 状态压缩DP,布布扣,bubuko.com

时间: 2024-11-03 21:47:18

POJ 1038 Bugs Integrated, Inc. 状态压缩DP的相关文章

CEOI 2002, POJ 1038 Bugs Integrated, Inc. 状态压缩 DP

有点点小虐心. #include <iostream> #include <cstring> #include <fstream> using namespace std; const int ternarys[12] = { 0, 1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049 }; int DP[2][59049]; int bit_map[155][15]; int pre_line[15]; int now

POJ 1038 Bugs Integrated, Inc. ——状压DP

状压上面有几个方块,然后DFS转移. 复杂度貌似很高$3_{}^{20}*n$ 反正过了 #include <map> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i)

POJ 1038 Bugs Integrated Inc (复杂的状压DP)

\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地就不应该写的,但是总觉得自己的思路会好一些,码量又小. 博主的核心思路其实就是用一个二进制数来压缩三行的状态,因为二进制的左移右移很方便.然后就是如果三进制会很不好转移. 我们可以用一个二进制数来预处理压缩出第 \(i\) 往下三行的障碍状态,前 \(m\) 个二进制位表第 \(i\) 行,中间 \

poj 3254 Corn Fields ,状态压缩DP

题目链接 题意: 一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案(一头牛都不放也是一种方案) state[i] 表示对于一行,保证不相邻的方案 状态:dp[i][ state[j] ]  在状态为state[j]时,到第i行符合条件的可以放牛的方案数 状态转移:dp[i][ state[j] ] =Sigma dp[i-1][state'] (state'为符合条

[POJ 2411] Mondriaan&#39;s Dream 状态压缩DP

题意 给定一个 n * m 的矩形. 问有多少种多米诺骨牌覆盖. n, m <= 11 . 实现 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 #define F(i, a, b) for (register int i = (a); i <= (b); i++) 6 #define LL long long 7 inline

poj 3254 Corn Fields(状态压缩dp)

Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares are infertile and

POJ 2288 Islands And Bridges 状态压缩dp+哈密顿回路

题意:n个点 m条边的图,路径价值定义为相邻点乘积,若路路径c[i-1]c[i]c[i+1]中c[i-1]-c[i+1]有边 则价值加上三点乘积找到价值最大的哈密顿回路,和相应的方法数n<=13.暴力dfs O(13!) TLE 由于n<13 经典的状态压缩dp [状态] [当前点位置 ][前一点位置] 注意上一个状态必须合法才能进行转移设状态dp[s][i][j] 当前状态为s,当前点为i上一个点为j的最大价值, ans=max(dp[(1<<n)-1][i])dp[s][i][

POJ 1038 Bugs Integrated, Inc.(状态压缩)

Bugs Integrated, Inc. Time Limit: 15000MS   Memory Limit: 30000K Total Submissions: 9088   Accepted: 3472 Case Time Limit: 5000MS Description Bugs Integrated, Inc. is a major manufacturer of advanced memory chips. They are launching production of a n

Poj 1185 炮兵阵地(状态压缩dp 入门题)

炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17272   Accepted: 6593 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击