计算跨栏到达目的地的可能方式?

时间:2019-02-21 22:28:40

标签: algorithm graph tree permutation dynamic-programming

我在开始位置时遇到问题,接着是在不同距离处的多个障碍,然后是结束位置。越过障碍的最大跨度为20。我的目标是通过跨过最大障碍的跨度来到达终点。

示例:

{0,15,20,25,29,31,......,45}

在上面的数组中,“ 0”是起始位置; “ 45”是结束位置;中间的其他所有点都是不同距离(15、20、25、29、31等)的航路点。连续的航路点之间存在障碍。假设数组始终从开始位置到结束位置按升序排序。如何计算跨栏跳跃的不同排列(每次跳跃都在最大跳跃大小以内)的所有可能的到达终点位置的方式?

1 个答案:

答案 0 :(得分:1)

这可以通过动态编程或DFS(深度而非广度)解决,具体取决于您如何看待问题。无论哪种方式,您都将从每个方法点到最后都记住解决方案。您可以从任何一端进行工作;这个问题是完全可逆的。让我们考虑序列{0,8,9,15,20}和跳转大小10。

import json

jsondata='''{
    "duration": 202.0,
    "session_info": {
        "activation_uuid": "ab90d941-df9d-42c5-af81-069eb4f71515",
        "launch_uuid": "11101c41-2d79-42cc-bf6d-37be46802fc8"
    },
    "timestamp": "2019-01-18T11:11:26.135Z",
    "source_page_view_reference": {
        "page_uuid": "1bede017-7b77-461d-82ef-a6bbcfdae4d7",
        "page_id": "/group/More",
        "page_name": "More",
        "view_uuid": "9580f3c5-1116-432a-83bc-9d0b5337f661",
        "page_type": "Native"
    },
    "analytics_sdk": {
        "component_id": "datasdk",
        "component_version": "1.0.52"
    },
    "treatment_id": "mockTreat",
    "client_event_id": "2b3cd878-6932-410b-b1ad-bc40ae888fdc",
    "campaign_id": "mockCamp"
}'''

data=json.loads(jsondata)

table=[[],[]]
def dictList(d, column_name=''):
    for k, v in d.items():
        if isinstance(v, dict):
            dictList(v, column_name=k)
            continue
        if column_name:
            column_name+='.'
        column_name +=k
        table[0].append(column_name)
        table[1].append(v)

dictList(data)

for row in table:
    print (row)

爬回递归树:

Starting from 0, you can reach nodes 8 and 9.  You'll recur on each of those.
From 8, you can reach 9 and 15; you'll recur on each.
From 9, you can reach only 15.
From 15, you can reach only 20.

看看效果如何?动态编程部分正在向后工作:第一次计算f(9)(在计算f(8)中)后,您会记住结果,并且在计算f(0)时不必重复计算。 / p>