我在开始位置时遇到问题,接着是在不同距离处的多个障碍,然后是结束位置。越过障碍的最大跨度为20。我的目标是通过跨过最大障碍的跨度来到达终点。
示例:
{0,15,20,25,29,31,......,45}
在上面的数组中,“ 0”是起始位置; “ 45”是结束位置;中间的其他所有点都是不同距离(15、20、25、29、31等)的航路点。连续的航路点之间存在障碍。假设数组始终从开始位置到结束位置按升序排序。如何计算跨栏跳跃的不同排列(每次跳跃都在最大跳跃大小以内)的所有可能的到达终点位置的方式?
答案 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>