leetcode 2320. 统计放置房子的方式数
class Solution {
public:
const int MOD = 1'000'000'007;
int countHousePlacements(int n) {
if(n == 1) return 4;
vector<long> dpZero(n+1);//dpZero[i]代表在位置 i 上不放置房子
vector<long> dpOne(n+1);//dpOne[i]代表在位置 i 上放置房子
dpZero[0] = 1;dpZero[1] = 1;
dpOne[0] = 1;dpOne[1] = 1;
for(int i = 2;i <= n;++i){
dpOne[i] = dpZero[i-1];//如果在 i 上放置房子,位置i-1必须不放置房子
dpZero[i] = (dpOne[i-1] + dpZero[i-1]) % MOD;//如果在 i 上不放置房子,位置i-1放不放房子都可以
}
return (dpOne[n] + dpZero[n]) * (dpOne[n] + dpZero[n]) % MOD;//由于两侧的房屋互相独立,根据乘法原理,答案为相乘而不是相加
}
};
灵神题解:其实就相当于斐波那契数列
class Solution {
public:
//若不放房子,那么第 i−1 个地块可放可不放,则有 f[i]=f[i−1];
//若放房子,那么第 i−1 个地块无法放房子,第 i−2 个地块可放可不放,则有 f[i]=f[i−2]。
//所以有 : f[i]=f[i−1]+f[i−2]
const int MOD = 1'000'000'007;
int countHousePlacements(int n) {
if(n == 1) return 4;
vector<int> dp(n+1);//dp[i]代表在直到位置 i 单侧的方案数
dp[0] = 1;dp[1] = 2;
for(int i = 2;i <= n;++i){
dp[i] = (dp[i-1] + dp[i-2]) % MOD;
}
return (long)dp[n] * dp[n] % MOD;//由于两侧的房屋互相独立,根据乘法原理,答案为相乘而不是相加
}
};
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)