思路:
第一想法用动规,但是不知道如何下手。浅看了一下答案,发现是做过的题。
易知:道路两排的房子摆列互不干扰,只需要保证每一侧的房子间隔排列即可。
所以,最终的结果为 dp[n]*dp[n]。
只需要对一侧设dp数组即可:
动规五步:
1.dp数组含义:有 i 块 地 的 放置方式;
2.初始化:dp[0]=1;dp[1]=2;
3.递推公式:dp[i]=dp[i-1]+dp[i-2];//第 i 块不放 ,方法有 dp[i-1]个,第 i 块放,方法有dp[i-2]个。
4.遍历顺序,从前往后;
5.打印数组;
代码:
注意:dp[n]可能取余后依然超过int 的范围,甚至long int的范围(32位的话),用long long int 来接收。
class Solution {
public:
const int Mod_num=1e9+7;
int dp_fun(int n){vector<long long int>dp(n+1,0); dp[0]=1;dp[1]=2;for(int i=2;i<n+1;i++){dp[i]=(dp[i-1]+dp[i-2])%Mod_num;}return dp[n];
}int countHousePlacements(int n) {if(n==1)return 4;if(n==2)return 9;long long int num=dp_fun(n);return (num*num)%Mod_num;}
};