思路:dp
其实我们不难发现,如果我们按照单侧来说,并且让我们求最大价值的话,这就是一个打家劫舍的动态规划问题。
但是这里我们需要求方案数。所以这里我们的dp含义就变成了:在前i块地皮中放置房子的方案数。
首先就是从头开始,dp[0]=1,也就是说,当全部没有放置房子的时候,就只有这一种情况;
dp[1]=2,这里就是对于第一块地皮放与不放的方案数;
剩下的,我们再讨论状态转移的问题:
加入我们现在正在定夺第i块地皮,这个时候,如果我们选择放房子,那么i-1块地皮肯定是不能放房子的,但是i-2块地皮是可以放或者可以不放的,也就是说,此时我们的方案数中,dp[i]=dp[i-2];
如果说我们不放这块地,那么i-1块地是可以放也可以不放的,也就是dp[i-1],这个时候dp[i]=dp[i-1]+dp[i-2]。这就是状态转移了。
但是我们这个只是对于单侧来说的,还有一侧呢?我们发现,另外一侧是在第一侧的基础上再有方案数的,也就是说,我们在做一个乘法原理的过程运算。
这样的话,总个数就是dp[n]*dp[n]了。
上代码:
class Solution {public int countHousePlacements(int n) {int []dp=new int[n+1];dp[0]=1;dp[1]=2;for(int i=2;i<=n;i++){dp[i]=(int)(((long)dp[i-1]+dp[i-2])%1000000007);}int res=(int)(((long)dp[n]*dp[n])%1000000007);return res;}
}