解题思路:

  • 普通的dp会超时,在输入过程中直接执行dp,令mx_idx表示当前i下所能到达的最远下标,每次输入取所能到达下标的最大值,假如能到达下标n-1则返回true,但如果在此过程中出现下标i的v为0,而该下标恰好是mx_idx所能达到的最远下标,则不能再继续往下走,可以中断,并返回false。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int v;
    int mx_idx = 0 ;
    int dp = 1;
    for(int i = 0; i < n; ++i){
        cin>>v;
        mx_idx = max(mx_idx, i+v);
      //记录所能到达的最大下标,一旦最大下标所在位置值为0,并且不是出口下标,则不能到达。
        if(mx_idx == i && v + i == i && i != n-1) {dp = 0; break;}
    }
    dp ? cout<<"true"<<endl : cout<<"false"<<endl;
    
    return 0;
}