我已经提出了一个经验公式,因此我成功测试了3次迭代here。
我无法提出可以解决此编程问题的工作代码。任何帮助表示赞赏。
答案 0 :(得分:2)
在整个解决方案中,我使用A
作为酒店,B
作为住宅
让我们定义3种类型的安排:
A
|| B
结尾的安排,即左边的酒店和右边的房子。B
|| A
结尾的安排,即左边的房子和右边的酒店。B
|| B
结尾的安排,即双方的住宅。让我们表示各自的数组:
one[i]
表示具有街道长度i
two[i]
表示具有街道长度i
three[i]
表示具有街道长度i
当街道长度增加1
时,可以扩展任何类型1的安排,如下所示:
B
|| A
A
|| B
[第2类安排]
B
|| B
A
|| B
[类型3安排]
当街道长度增加1
时,可以扩展任何类型2的安排,如下所示:
A
|| B
B
|| A
[第1类安排]
B
|| B
B
|| A
[类型3安排]
当街道长度增加1
时,可以扩展任何类型3的安排,如下所示:
A
|| B
B
|| B
[第1类安排]
B
|| A
B
|| B
[第2类安排]
B
|| B
B
|| B
[类型3安排]
当街道长度为1
时:
one[1] = two[1] = three[1] = 1
(如样本测试案例中所述)
当街道长度为i
时:
one[i] = two[i-1] + three[i-1]
two[i] = one[i-1] + three[i-1]
three[i] = one[i-1] + two[i-1] + three[i-1]
对于大小为n
的街道长度,您的答案为(one[n] + two[n] + three[n]) % 10^9+7
由于n
可能非常庞大,您需要为(one[n] + two[n] + three[n]) % 10^9+7
For n=1: result = 3
For n=2: result = 7
For n=3: result = 17
For n=4: result = 41
自己验证上述结果!!!
修改:您可以使用矩阵取词来查找n
时间内O(logn)
的不同值的结果。看看here了解更多细节!
您可以使用矩阵来表示递归关系。
(one[n+1]) = ( 0 1 1 ) (one[n])
(two[n+1]) ( 1 0 1 ) (two[n])
(three[n+1]) ( 1 1 1 ) (three[n])
通过这种表示,通过矩阵指数(模n
),通过平方指数计算大10^9+7
的值是可行的。那将在O(log n)时间内给你结果。
(one[n]) = ( 0 1 1 )^(n-1) (1)
(two[n]) ( 1 0 1 ) (1)
(three[n]) ( 1 1 1 ) (1)
快乐编码......