博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1351 Number of Locks(DP:记忆化搜索)
阅读量:5841 次
发布时间:2019-06-18

本文共 1087 字,大约阅读时间需要 3 分钟。

题意:

锁上有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 Accepted 196K 0MS 777B 2016-06-01 21:46:02
#include
#include
#include
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;}

转载于:https://www.cnblogs.com/seasonal/p/10343728.html

你可能感兴趣的文章
允许SQL Server 2005远程连接
查看>>
微软为asp.net ajax和jquery创建了CDN
查看>>
Chris:怎样成为一名Android应用开发
查看>>
常见的makefile写法【转】
查看>>
emmet,jade,haml, slim,less,sass,coffeescript等的实战优缺点
查看>>
和菜鸟一起学linux总线驱动之初识spi驱动数据传输流程【转】
查看>>
WorkFlow设计篇Step.4—异常处理(续)-WF4.0
查看>>
GNU make manual 翻译( 一百零三)
查看>>
深入浅出 React Native:使用 JavaScript 构建原生应用
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-> Web版本新增新的用户权限设置界面效率更高、更规范...
查看>>
Java可视化AWT
查看>>
第 29 章 KVM
查看>>
Foundations of Python Network Programming - 读书笔记系列(3) - Email Services
查看>>
[LeetCode] Lowest Common Ancestor of a Binary Tree 二叉树的最小共同父节点
查看>>
Oracle下建立dblink时的权限问题
查看>>
chrome浏览器,调试详解,调试js、调试php、调试ajax
查看>>
jQuery Ajax 回顾
查看>>
Python天天美味(8) - 字符串中的字符倒转
查看>>
点在多边形内算法,C#判断一个点是否在一个复杂多边形的内部
查看>>
SAP HANA中创建与时间相关的数据及Time Attribute View(Gregorian)
查看>>