此为该题题干,提及数组,最少,则考虑使用动态规划。
题中可知,从一根竹竿到另一根,可以从最低点走过去,或穿越过去。
若从最低点走,则需考虑前一次的方式,若前一次也是最低点走,则可以直接走,若前一次选择穿越,则先要从杆子上爬下来。
选择穿越也如此考虑。
所以,从第i-1根杆到第i根杆,需要考虑前一次所用的方式,以及这一次所用的方式。不妨设置三维数组 dp[i][j][k],代表到第i根杆所需的最短时间,j为1,则上一次选择穿越,k为1,则这一次选择穿越。
import os
import sys
n=int(input())
x=list(map(int,input().split(" ")))
across=[]
for i in range(n-1):
across.append(list(map(int,input().split(" "))))
#dp[n][i][j] i represent the last j present now 1 standard for use
dp=[[[0 for _ in range(2)] for _ in range(2)] for _ in range(n)]
dp[1][0][0]=x[1]-x[0]
dp[1][1][0]=x[1]-x[0]
dp[1][0][1]=across[0][0]/(0.7)
dp[1][1][1]=across[0][0]/(0.7)
for i in range(2,n):
k=min(dp[i-1][1][0],dp[i-1][0][0])
u=min(dp[i-1][1][1],dp[i-1][0][1])
dp[i][0][0]=k+x[i]-x[i-1]
dp[i][1][0]=u+across[i-2][1]/(1.3)+x[i]-x[i-1]
dp[i][0][1]=k+across[i-1][0]/(0.7)
if across[i-2][1]>across[i-1][0]:
dp[i][1][1]=u+(across[i-2][1]-across[i-1][0])/(1.3)
else:
dp[i][1][1]=u+(across[i-1][0]-across[i-2][1])/(0.7)
print("%.2f"%(min(dp[n-1][0][0],dp[n-1][0][1]+across[n-2][1]/(1.3),dp[n-1][1][1]+across[n-2][1]/(1.3),dp[n-1][1][0])+x[0]))