【第22期】观点:IT 行业加班,到底有没有价值?

POJ1351 Number of Locks(DP:记忆化搜索)

原创 2016年06月01日 22:03:26

题意:

锁上有n个槽,槽的高度可以是1~4,现在要求锁上至少有两个相邻的槽之间的高度差为3并且至少有3种不同高度的槽,问有几种排列方式

要点:

这题应该是可以通过排列组合简单得出结论的,但是我推不出来,看了一下网上的做法都是用DP记忆化搜索,思路是用dp[i][now][j][m]存储有多少种方案,i表示第i个槽,now表示当前槽的高度,j表示是否达到相邻高度差为3,达到了则为1,m为有m种不同高度。用dfs搜索时引入一个变量s,它用二进制表示已经使用了哪几个高度,如1011,说明1,2,4高度已经使用。


15581120 Seasonal 1351 Accepted 196K 0MS C++ 777B 2016-06-01 21:46:02

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long long dp[20][5][2][20];
int n;

long long dfs(int i, int now, int j, int s, int m)//s作为一个二进制记录哪几个高度已经使用,如1011,说明1,2,4高度已经使用
{
	if (i >= n)
	{
		if (j&&m >= 3)
			return 1;
		else
			return 0;
	}
	if (dp[i][now][j][m] != -1)
		return dp[i][now][j][m];
	long long ans = 0;
	int temp;
	for (int k = 1; k <= 4; k++)
	{
		if (!(s & 1 << (k - 1)))//s中没有k高度
			temp = m + 1;
		else
			temp = m;
		ans += dfs(i + 1, k, (now != 0 && abs(k - now) == 3) || j,s|1<<(k-1), temp);//now不能取一开始的0
	}
	dp[i][now][j][m] = ans;
	return ans;
}

int main()
{
	while (~scanf("%d",&n) && n != -1)
	{
		memset(dp, -1, sizeof(dp));
		dfs(0, 0, 0, 0, 0);
		printf("%d: %lld\n",n,dp[0][0][0][0]);
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

poj 1351 DFS

思路: 记忆化搜索

POJ 1351-Number of Locks(记忆化搜索)

Number of Locks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1140  ...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

poj1351Number of Locks(记忆化搜索)

题目链接: 传送门 思路: 这道题是维基百科上面的记忆化搜索的例题。。。 四维状态dp[maxn][5][2][5]分别表示第几根棒子,这根棒子的高度,是否达到题目的要求和使用不同棒子数,...

POJ-1351 Number of Locks

Number of Locks Time Limit: 1000MS   Memory Limit: 10000K       Descripti...

POJ 1351 Number of Locks (记忆化搜索 状态压缩)

POJ 1351 Number of Locks (记忆化搜索 状态压缩)

poj 1351 Number of locks

dp[i][j][k][s]表示当前到第i把锁,高度为j,是否出现高度差为3(k=1表示出现过,0表示没有出现过),使用高度的种数为s的方案数类似于按位DP的思想,记忆化求解dfs的时候枚举第i+1位...

POJ1351 Number of Locks 记忆化搜索

第二道记忆化搜索的题目。其实一直都没搞太明白,这道题好像也比较冷门,网上资料也不多,主要有: http://blog.csdn.net/scorpiocj/article/details/66421...

Sicily 1351. Multi-key Sorting

1351. Multi-key Sorting Constraints Time Limit: 10 secs, Memory Limit: 32 MB Description Consi...

1351. Multi-key Sorting

一开始没有仔考虑,认为去掉重复的就好了,所以就从前往后遍历,将重复的标记,最后直接输出没有标记过的数字。    当然时错的,看了下别人的思路没看懂,但是代码都是从后往前遍历。之后突然想到题目中说的s...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)