一开始我也是打的相乘
var countHousePlacements = function (n) {
const dp = new Array(n).fill(0)
dp[0] = 2;
dp[1] = 3;
for (let index = 2; index < dp.length; index++) {
dp[index] = (dp[index - 1] + dp[index - 2]) % (1000000000 + 7)
}
return (dp[n-1]*dp[n-1])% (1000000000 + 7)
};
但是发现不管怎么样都差了几百
没办法转成了dp
var countHousePlacements = function (n) {
const dp = new Array(n).fill(0).map(() => new Array(4).fill(0));
dp[0][0] = 1;//不存在房屋
dp[0][1] = 1;//存在房屋
dp[0][2] = 1;//上存在下不存在
dp[0][3] = 1;//上不存在下存在
for (let index = 1; index < dp.length; index++) {
dp[index][0] = (dp[index - 1][0] + dp[index - 1][1] + dp[index - 1][2] + dp[index - 1][3]) % (1000000000 + 7)
dp[index][1] = dp[index - 1][0] % (1000000000 + 7)
dp[index][2] = (dp[index - 1][3] + dp[index - 1][0]) % (1000000000 + 7)
dp[index][3] = (dp[index - 1][2] + dp[index - 1][0]) % (1000000000 + 7)
}
let result = 0
for (let index = 0; index < 4; index++) {
result+= dp[dp.length-1][index]
}
return result% (1000000000 + 7)
};
后来提交成功发现官解跟我的答案始终都差
根据调试发现应该是JS的浮点数计算跟其他的语言有不一致的情况
给数字后面加个n并且mod的数字也改为Bigint再跑就会出现正确答案
var countHousePlacements = function (n) {
const dp = new Array(n+1).fill(0n)
dp[0] = 1n;
dp[1] = 2n;
for (let index = 2; index < dp.length; index++) {
dp[index] =( dp[index - 1] + dp[index - 2]) % (1000000000n + 7n)
}
return (dp[n]*dp[n])% (1000000000n + 7n)
};
应该跟IEFI浮点数的标准实现有关,就不细究更多了,反正能过就行