uacs2024

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

leetcode 2320. 统计放置房子的方式数

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;//由于两侧的房屋互相独立,根据乘法原理,答案为相乘而不是相加
    }
};
复制代码

 

posted on   ᶜʸᵃⁿ  阅读(2)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示