Title

(线性dp)LeetCode2320. 统计放置房子的方案数

(线性dp)LeetCode2320. 统计放置房子的方案数

思路

类似于装箱问题,也类似于打家劫舍,应该都是同一个模板题

可以开一个二维数组记录状态

老问题:第\(i\)个位置到底放不放房子

\(dp[i][0/1]\)表示前\(i\)个房子第\(i\)个房子放(不放)的最大方案数

如果放的话\(dp[i][1] = dp[i - 1][0]\)

如果不放的话\(dp[i][0] = dp[i - 1][1] + dp[i - 1][0]\)

方案数是放和不放的方案数加起来

\(dp[i] = dp[i][0] + dp[i][1]\)

那么也可以转化为一维数组

如果放的话,第\(i - 1\)个不能放,但是第\(i - 2\)个任意,\(dp[i] = dp[i - 2]\)

如果不放的话,第\(i- 1\)个任意,\(dp[i] = dp[i - 1]\)

所以\(dp[i] = dp[i - 1] + dp[i - 2]\)

代码

const int mod = 1e9 + 7;
using lli = long long;
int countHousePlacements(int n) 
{
    int dp[100010][2] = {0};
    dp[0][1] = dp[0][0] = 1;
    for (int i = 1; i < n; i++)
    {
        dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) % mod;
        dp[i][1] = dp[i - 1][0];
    }
    lli ans = (dp[n - 1][1] + dp[n - 1][0]) % mod;
    lli res = (ans % mod) * (ans % mod) % mod;
    return res;
}

或者

const int mod = 1e9 + 7;
using lli = long long;
int countHousePlacements(int n) 
{
    lli dp[100010] = {0};
    dp[0] = 2, dp[1] = 3;
    for (int i = 2; i < n; i++)
    {
        dp[i] = ((dp[i - 1] % mod) + (dp[i - 2] % mod)) % mod;
    }
    lli res = (dp[n - 1] % mod) * (dp[n - 1] % mod) % mod;
    return res;
}
posted @ 2024-10-02 22:40  栗悟饭与龟功気波  阅读(16)  评论(0)    收藏  举报