第一种方法是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; }