公平分配编程问题的解决方案

时间:2016-11-27 06:47:27

标签: algorithm

自从我参加编码比赛以来,我遇到了一堵墙。我认为这个问题属于公平分配的范畴,但我不确定。 我附上问题here

我已经提出了一个经验公式,因此我成功测试了3次迭代here

我无法提出可以解决此编程问题的工作代码。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

在整个解决方案中,我使用A作为酒店,B作为住宅

让我们定义3种类型的安排:

  1. A || B结尾的安排,即左边的酒店和右边的房子。
  2. B || A结尾的安排,即左边的房子和右边的酒店。
  3. B || B结尾的安排,即双方的住宅。
  4. 让我们表示各自的数组:

    • 数组one[i]表示具有街道长度i
    • 的类型1的排列数
    • 数组two[i]表示具有街道长度i
    • 的类型2的排列数
    • 数组three[i]表示具有街道长度i
    • 的类型3的排列数

    当街道长度增加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)
    

    快乐编码......