【线性DP】LeetCode 2320. 统计放置房子的方式数
1.【线性DP】LeetCode 2320. 统计放置房子的方式数
题目
https://leetcode.cn/problems/count-number-of-ways-to-place-houses/
题解
由于道路两边的房子彼此互不影响,因此满足相互独立的条件,故而两侧的方案的乘积就是最后的答案。
因为两侧空地的数量都是
每块空地上都可以选择建或者不建房子,但建房子后,其左右两侧相邻空地都不能再建房子。基于此,定义一个二维数组
:不在第 块空地上建房子的方案数 :在第 块空地上建房子的方案数
对于第
对于第
对于第
那么,对于每侧有
对上述过程,我们可以观察到:
- ...
那么可以优化为滚动数组,将二维数组优化为一维数组:
优化为一维数组后的总方案数为:
参考代码
二维dp数组
constexpr int MOD = 1e9 + 7; constexpr int N = 1e4 + 1; int dp[N][2] = {{1, 0}, {1, 1}}; int init = []() { for (int i = 2; i < N; ++ i) { dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) % MOD; dp[i][1] = dp[i - 1][0]; } return 0; }(); class Solution { public: int countHousePlacements(int n) { return (1LL * dp[n][0] + dp[n][1]) % MOD * (1LL * dp[n][0] + dp[n][1]) % MOD; } };
一维dp数组
constexpr int N = 1e4 + 1; constexpr int MOD = 1e9 + 7; int dp[N] = {1, 2}; int init = []() { for (int i = 2; i < N; ++ i) { dp[i] = (dp[i - 1] + dp[i - 2]) % MOD; } return 0; }(); class Solution { public: int countHousePlacements(int n) { return 1LL * dp[n] * dp[n] % MOD; } };
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型