#include <bits/stdc++.h>

using namespace std;

auto const Random_Address=[]{char*c;  c=new char;  delete c;  return uint64_t(c);};
uint64_t const SEED=chrono::steady_clock::now().time_since_epoch().count()*(Random_Address() bitor 1);
mt19937 Rng(SEED);

constexpr int Mask(int i){return 1<<i;}
constexpr int Getb(int x,int i){return x>>i bitand 1;}
template<size_t N> bitset<N> Bits(int x){return bitset<N>(x);}
template<class X,class Y> bool minimize(X&x,Y const&y){return y<x?x=y,1:0;}
template<class X,class Y> bool maximize(X&x,Y const&y){return y>x?x=y,1:0;}

int main(){
  cin.tie(nullptr)->sync_with_stdio(false);
  #ifndef ONLINE_JUDGE
  freopen("t.inp","r",stdin);freopen("t.out","w",stdout);
  #endif // ONLINE_JUDGE
  int Test;  cin>>Test;
  while(Test--){
    int const infi=0x3f3f3f3f;
    int N;  cin>>N;
    vector<int> a(N+1);
    for(int i=1;i<=N;i++)
      cin>>a[i];
    vector<vector<int>> f(N+1,vector<int>(N+1,infi));
    for(int i=1;i<=1+a[1];i++)
      f[1][i]=0;
    for(int i=2;i<=N;i++){
      int cnt=0;
      for(int j=i-1;j>=1;j--){
        if(j+a[j]<i) continue;
        minimize(f[i][min(N,j+a[j])],f[j][i-1]+cnt);
        ++cnt;
      }
      for(int j=i+1;j<=N;j++)
        minimize(f[i][j],f[i][j-1]);
    }
    cout<<f[N][N]<<'\n';
  }
  return 0;
}
