此题利用动态规划思路

根据第一问我们从后向前遍历(倒数第二位开始)我们比较每一位数是否大于该点到终点的距离若大于则更新终点为该点,如不大于则跳过继续向前遍历,这样我们把可以作为终点的点在dp数组里面记为1否则记为0,然后通过dp数组的下标对应输入的数组下标,所以我们找到了数组中对应的元素,然后加上终点元素大小(这里的终点没有更新dp为1所以要加上)。

# 此题利用动态规划思路
a = int(input())  # 取出数组长度
b = [int(i) for i in input().split()]  # 取出数组内容


def judg(a, b):
    if len(b) == 0:
        # print("false")
        print("-1")
        return
    if len(b) == 1:  # 如果数组只有1的长度,那必然已经在终点
        # print("true")
        print(b[0])
        return
        # print(b[0])
    else:
        index = []
        sum = b[-1]
        # 创建dp数组,0代表无法到达终点,1代表可以到达终点
        dp = [0] * len(b)
        target = len(b) - 1  # 终点为数组的最后一个索引
        for i in range(
            a - 2, -1, -1
        ):  # 从倒数第二个索引开始遍历,如果它和target之间的差值小于等于它本身的值,代表这个位置可以到达终点,因此我们更新终点为i,即代表只要能达到这个位置就必定能到终点
            if target - i <= b[i]:
                target = i
                dp[i] = 1
        # 最终判断dp[0]是否等于1,因为起点一定是dp[0],因此如果它等于1,必然存在一条路线到达终点
        # print("true" if dp[0] == 1 else "false")
        # print(dp)
        for i in range(len(dp)):
            if dp[i] == 1:
                index.append(i)
        for j in index:
            sum += b[j]
        # print(index)
        # print(sum)
        print(sum) if dp[0] == 1 else print("-1")
        return


# if judg(a,b):
#     pass
# else:
#     print("-1")
judg(a, b)