当前位置:首页>java>leetcode编程算法随笔(难度分1608)-2320. 统计放置房子的方式数

leetcode编程算法随笔(难度分1608)-2320. 统计放置房子的方式数

  • 2026-10-21 13:27:16
leetcode编程算法随笔(难度分1608)-2320. 统计放置房子的方式数

题目

https://leetcode.cn/problems/count-number-of-ways-to-place-houses/description/

一条街道上共有 n * 2 个地块,街道的两侧各有 n 个地块。每一边的地块都按从 1 到 n 编号。每个地块上都可以放置一所房子。

现要求街道同一侧不能存在两所房子相邻的情况,请你计算并返回放置房屋的方式数目。由于答案可能很大,需要对 109 + 7 取余后再返回。

注意,如果一所房子放置在这条街某一侧上的第 i 个地块,不影响在另一侧的第 i 个地块放置房子。

主要包含

#基本的动态规划

#乘法原理

#状态转移的矩阵表示

#矩阵快速幂

##思路到实现 

思路
动态规划是比较容易想到的,然后是找合适的状态转移方程
方法一
可以看到,每一列的状态,按照有没有房子,一共4有四种,
街道上边有 1 0
街道下边有 0 1 
两边有房子 1 1
两边都没有 0 0
确定初始状态   与状态转移的可能性就可以得到
方法二
优化,乘法原理。
注意到两排房子的互相无关,因此,只计算一排就可以了。然后用乘法。
可以看出,一排房子就是斐波那契数列。
方法三
将状态转移矩阵化,并使用快速幂
第一次看到这个方法时候感觉到的是一种“美”, 
对于斐波那契数列,通常我们都知道
如果将两项写一起,有如下形式

写为列向量的形式

它还可以写为
然后有
为什么尝试这么写呢?
之后就是用快速幂的代码实现

#思路与实现
没有思路自然没得说。
若思路有,且大体上是正确,但是代码的实现存在问题,一味的多练习,可能也是可以的,但是找一下自己的实现(思路)在哪里容易犯错可能会改正的更快些。
比如,
动态规划的起始状态的数值。
状态转移的时候,是不是漏了或者弄错了。
#另外,注意一下矩阵的Strassen

最新文章

随机文章