第一种方法是DP函数通过递归加回溯,从0位置从前往后找出所有能够到达终点的路径,将结果累加到sum中,若能到达终点且sum>max就赋值给max,但是复杂度过大pass掉了。
第二种方法是通过从后向前的循环,找出能走通的每一个节点并进行累加,就是这么简单。。。。。。

#include <stdio.h>
int max = -1;
int  DP(int* array, int size, int jump, int idx, int sum) {
    if (idx == size - 1) {
        max = max > (sum + array[idx]) ? max : (sum + array[idx]);
        return 0;
    }
    if (idx >= size) {
        return 0;
    }
    for (int k = 1; k <= jump; k++) {
        if (idx < size) {
            DP(array, size, array[idx + k], idx + k, sum + array[idx]);
        } else {
            break;
        }
    }
    return 0;
}
int main() {
    int b,size;
    scanf("%d", &size);//size为数组长度
    int array[size], i = 0;
    while (scanf("%d", &b) != EOF) {
        array[i++] = b;
    }
    int len=size-1,pre,sum = 0;
    for(int k=size-1;k>=0;k--){//从尾巴开始向前推
        if(array[k]>=len-k){
            int temp=array[k];
            sum+=temp;
            len=k;
        }
        else{
            pre=sum+1;//与sum比较判断能否到达第一个点
        }
    }
    pre=pre>sum?-1:sum;
    printf("%d", pre);
    //fun(array, size, array[0], 0, sum);
    //printf("%d", max);
    return 0;
}