查看: 8931| 回复: 17
跳转到指定楼层
上一主题 下一主题
收起左侧

[动态规划] 求助一道动态规划的题目:dominos Tiling 3d

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
如果是2d,递推公式不难想出来。但是换成3d了,脑子有点转不过来了,可以给点思路吗

271641175083_.pic.jpg (209.36 KB, 下载次数: 11)

271641175083_.pic.jpg

评分

参与人数 2大米 +11 收起 理由
Aliza1224 + 1 很有用的信息!
14417335 + 10 给你点个赞!

查看全部评分


上一篇:分享刷题总结求米看面经
下一篇:关于语言
wangshibo1993 2022-1-6 13:22:29 | 只看该作者
全局:
本帖最后由 wangshibo1993 于 2022-1-5 21:25 编辑

令f(n)表示2x2xn的组合数(最顶层无缺口),g(n)表示高度为n的顶上有2/4突出的组合数(即取走一个横着的积木),h(n)表示高度为n的顶上有3/4突出的组合数(即取走一个竖着的积木)。
  1. f(n) = 2*g(n) + h(n)
  2. g(n) = f(n-1)+ g(n-1)
  3. h(n) = f(n-2) + 2*g(n-1)
复制代码
可以把h(n)消掉得到
  1. f(n) = 2*g(n) + 2* g(n-1) + f(n-2)
  2. g(n) = g(n-1) + f(n-1)
复制代码
base case:
  • f(0) = 1, for convenience, 没有积木时算1种valid组合
  • g(0) = 0,for convenience
  • g(1) = 1
  • f(1) = 2

sample results when n is small:
f(2) = 9, g(2) = 3
f(3) = 32, g(3) = 12
f(4) = 121, g(4) = 44


评分

参与人数 2大米 +7 收起 理由
preemsbert + 1 很有用的信息!
14417335 + 6 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
本帖最后由 我已全仓 于 2022-1-4 13:28 编辑

从2*2底部向上搭建n层,只可能出现两种状态,一是最下层是平的,二是有一半连着的凸出(只可能上下左右四种情况,且这一半是两块竖着放导致的)。用0,1分别表示上述两种状态。不会出现第三种情况是因为1个突出、2个对角突出、3个突出是配不平的。
设dp[n][state]表示已经有n层完整且状态是state时的方法数,求dp[n][0]

递推公式:
对 n >= 2有
dp[n][0] = 2 * dp[n - 1][0] + dp[n - 1][1] + dp[n - 2][0]
dp[n][1] = 4 * dp[n - 1][0] + dp[n - 1][1]
edge case:
dp[0][0] = 1, dp[0][1] = 1
dp[1][0] = 2, dp[1][1] = 4

则dp[2][0] = 9, dp[3][0] = 28

参考790题写的,lz可以试试看对不对


评分

参与人数 2大米 +4 收起 理由
qjx1994 + 1 给你点个赞!
14417335 + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

推荐
今今亮 2022-1-26 10:46:02 | 只看该作者
全局:
wangshibo1993 发表于 2022-1-6 00:22
令f(n)表示2x2xn的组合数(最顶层无缺口),g(n)表示高度为n的顶上有2/4突出的组合数(即取走一个横着的积 ...

怎么说呢,感觉内在逻辑还是有点弄不懂。能否麻烦讲稍微详细一点?我看这道题google也没有答案
回复

使用道具 举报

推荐
Harry·Sun 2022-1-9 04:23:02 | 只看该作者
全局:
public class Domino_3D {
        private int mod = 1000000007;
        public int numTilings(int n) {
                long[] dp = new long[n+2];
                long[] dpa = new long[n+2];
                dp[0] = 1;
                dp[1] = 2;
                dpa[0] = 0;
                dpa[1] = 1;
                for(int i =2;i<=n;i++) {
                        dpa[i] = dpa[i-1]+dp[i-1] % mod;
                        dp[i] = (2*dpa[i]+2*dpa[i-1]+dp[i-2]) % mod;       
                }
                return (int)dp[n];
        }
}
回复

使用道具 举报

🔗
qqzz 2022-1-4 22:20:39 | 只看该作者
全局:
可以给下n=2的结果不?是9种嘛?

评分

参与人数 1大米 +1 收起 理由
14417335 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
考虑了cube竖起来了没
回复

使用道具 举报

🔗
y75475 2022-1-6 10:11:36 | 只看该作者
全局:
本帖最后由 y75475 于 2022-1-5 20:15 编辑

我来帮楼主补剩下的图吧,我也正在寻找解法:




评分

参与人数 1大米 +5 收起 理由
14417335 + 5 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
stonepeter 2022-1-6 13:36:22 | 只看该作者
全局:
会不会和catalan number有关?
回复

使用道具 举报

🔗
jpkymsfd 2022-1-6 16:33:49 | 只看该作者
全局:
求一个链接~ 或者n <= 5的base case
回复

使用道具 举报

全局:
是不是tiktok哈哈
回复

使用道具 举报

🔗
y75475 2022-1-9 00:59:52 | 只看该作者
全局:
wangshibo1993 发表于 2022-1-5 23:22
令f(n)表示2x2xn的组合数(最顶层无缺口),g(n)表示高度为n的顶上有2/4突出的组合数(即取走一个横着的积 ...

你好,请问换成java代码应该怎么写呢,这个公式有点看不懂呢,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表