HihoCoder第九周 状态压缩 二 与POJ2411总结

在此我向各位博友求助,特别想知道除了HihoCoder上面的结果要对1e9+7取余之外,这两道题还有什么其他的问题,都是骨牌覆盖问题,都是状态压缩+dp,为什么我能过poj2411的程序过不了HihoCoder,还不是其他诸如TimeLimited,而是Wrong Answer,这个问题我想了很久,还是不知道是怎么回事,如果有神通广大的博友知道答案,希望你能告诉我。顺便说一下,HihoCoder给的那个hint只看懂了一部分递推的公式,其中满足的那个条件还是不懂。

两个题目的连接地址:

http://hihocoder.com/problemset/problem/1048

http://poj.org/problem?id=2411

骨牌覆盖问题我想了很久很久,我自己也知道对于每一个位置上的骨牌来说,有三种可能,有可能是上楼的骨牌,有可能是下楼的骨牌,也有可能是同楼层的骨牌。但当时我思考的时候,就在想,比方说2*2这个位置。

有两种摆法,我当时就在想如何记录result[1][1]=2,因为这两种条件都满足了,所以result[1][1]=2?那之后的result[1][2]呢?

觉得这样不对。就完全没有思路了。

最后看了一个动态规划算法,但其实这道题算动态规划的话,我更觉得像枚举,枚举上楼的所有情况,枚举下楼的所有情况,看这两种情况里面,哪些合拍,之后才是动态规划记录其和的事。

首先觉得这种记录方法很棒,即记录两层楼的状态,如果是01代表竖着一个骨牌。如果是10代表,楼上的骨牌怎么来的不知道,但从楼下竖着一块牌是确定的。如果是11,说明都是横着的牌,所以楼上和楼下的下一张牌都要是1才能满足条件。如果是00,则GG。

之后就是第一层的初始化,只需记住1要成对出现就行了(因为这是第一层)。

被这题折磨太久,印象实在太深。希望交流。

#include <iostream>
#include <cstring>
using namespace std;

#define M 12

long long dp[12][1<<M];
int n,m;

int init_ok(int i)
{
	int count;
	for(count=m-1;count>=0;)
	{
		if((i>>count)&1)
		{
			if((i>>(count-1))&1)
			{
				count= count-2;
				continue;
			}
			else
			{
				count--;
				return 0;
			}
		}
		else
		{
			if(count==1&&(i&1))
				return 0;
			else
			{
				count--;
				continue;
			}
		}

	}
	return 1;
}

void init()
{
	int count;
	int kongjian = (1<<m)-1;

	memset(dp,0,sizeof(dp));

	for(count=0;count<=kongjian;count++)
	{
		if(init_ok(count))
			dp[0][count]=1;
	}
}

bool match(int a, int b)
{
	for (int i = 1; i < 1 << m;)
	{
		if (((a & i) == 0) && ((b & i) == 0))
			return false;
		if ((a & i) && (b & i))
		{
			if ((a & (i << 1)) && ((b & (i << 1))))
			{
				i <<= 2;
				continue;
			}
			else
				return false;
		}
		i <<= 1;
	}
	return true;
}

int main()
{

	while(scanf_s("%d %d",&n,&m),n &&m)
	{
		int i,shang,xia;
		if(n < m)
			i = n ,n = m,m =i;
		int kongjian = (1<<m)-1;

		init();

		for(i=1;i<n;i++)
		{
			for(xia = 0;xia<=kongjian;xia++)
			{
				for(shang=0;shang<=kongjian;shang++)
				{
					if(match(shang,xia))
						dp[i][xia]+=dp[i-1][shang];

				}
			}
		}

		cout<<dp[n-1][kongjian]<<endl;
	}

	return 0;
}

时间: 2024-10-10 00:34:29

HihoCoder第九周 状态压缩 二 与POJ2411总结的相关文章

hihoCoder 1048 : 状态压缩&#183;二

题目链接:http://hihocoder.com/problemset/problem/1048 题目大意:用1*2或者2*1的方块铺满一个N*M的大方格,共有多少种方法.结果对1e9+7取余.2<=N<=1000, 3<=m<=5 解题思路:挑战程序设计竞赛上有基本上一样的题目,可以参考,原题中也有提示.大致思路就是,如果从左往右铺的话,那么对第i行j列的方块来说,第i-1行的方块一定全部铺过,第j+2行的一定没有铺过.所以我们可以保存第i行和第i+1行的状态,然后递推.又由于

算法练习系列—hiho1044 状态压缩二(捡垃圾)

题目地址:http://hihocoder.com/problemset/problem/1044 算法思路:此题可以看做是铺地砖的变形,没有明显的行数和状态,但是我们可以自己将其中的行和状态给扣出来.其中第一行就是N个数的中前(0,1,2-M-1), 第二行就是(2,3..M)-一直到最后一行为(N-M-N).每一行的状态个数即为2^M-1(即这M个位置要么填写1,要么填写0).此时可用F[i][j]表示第i行状态为j时的垃圾最大值.最终的结果就是第N-M行所对应的状态中的最大值. 上一遍bl

POJ2411 Mondriaan&#39;s Dream(状态压缩)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 15295   Accepted: 8820 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

POJ2411 状态压缩

Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 11208 Accepted: 6521 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (w

POJ2411——状态压缩+DFS——Mondriaan&#39;s Dream

Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use his toilet paper to draw on, for all of his paper was filled with squares and r

[hihoCoder] 1044 : 状态压缩&#183;一

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市--那座城市即将举行美食节! 但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票--他们只能够乘坐最为破旧的火车进行他们的旅程. 不仅如此,因为美食节的吸引,许多人纷纷踏上了和小Hi小Ho一样的旅程,于是有相当多的人遭遇到了和小Hi小Ho一样的情况--这导致这辆车上的人非常非常的多,以至于都没有足够的位置能让每

hihoCoder week8 状态压缩&#183;一

状态压缩  写了两个半小时  太菜了 题目链接 https://hihocoder.com/contest/hiho8/problem/1 #include <bits/stdc++.h> using namespace std; const int N = 10; const int MAXN = 1<<11; int n, m, q, w[MAXN]; // 存取到达i时候, 前面m-1个的状态 int dp[1024][MAXN]; int Count(int x) { in

HihoCoder 1044 垃圾清理 状态压缩&#183;一

状态压缩·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市--那座城市即将举行美食节! 但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票--他们只能够乘坐最为破旧的火车进行他们的旅程. 不仅如此,因为美食节的吸引,许多人纷纷踏上了和小Hi小Ho一样的旅程,于是有相当多的人遭遇到了和小Hi小Ho一样的情况--这导致这辆车上的人非常非常的多,以至于都没有足

算法练习系列—hiho1048 状态压缩一(铺地砖)

题目地址:http://hihocoder.com/problemset/problem/1048 编程之美的课后题也有一个和整个题目一样的.(P269) 题目 这个题目的题意很容易理解,在一个N*M的格子里,我们现在有两种类型的砖块,1 * 2和 2 * 1,问一共有多少种方案,可以将整个N*M的空间都填满. 最简单的例子就是下面的了: 编程之美中题目: 某年夏天,位于希格玛大厦四层的微软亚洲研究院对办公楼的天井进行了一次大规模的装修.原来的地板铺有 N×M 块正方形瓷砖,这些瓷砖都已经破损老