(线性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;
}

浙公网安备 33010602011771号