#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static const long long L = 233333;
  static char sxd[L], *sss = sxd, *ttt = sxd;
  if (sss == ttt) {
    ttt = (sss = sxd) + fread(sxd, 1, L, stdin);
    if (sss == ttt) {
      return EOF;
    }
  }
  return *sss++;
}
inline char readalpha() {
  char c = gc();
  for (; !isalpha(c); c = gc())
    ;
  return c;
}
inline char readchar() {
  char c = gc();
  for (; c == ' '; c = gc())
    ;
  return c;
}
template <class T>
inline bool read(T& x) {
  bool flg = false;
  char c = gc();
  x = 0;
  for (; !isdigit(c); c = gc()) {
    if (c == '-') {
      flg = true;
    } else if (c == EOF) {
      return false;
    }
  }
  for (; isdigit(c); c = gc()) {
    x = (x << 1) + (x << 3) + (c ^ 48);
  }
  if (flg) {
    x = -x;
  }
  return true;
}
template <class T>
inline void write(T x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  if (x < 10) {
    putchar(x | 48);
    return;
  }
  write(x / 10);
  putchar((x % 10) | 48);
}
const int maxn = 505;
const int mod = 1000000007;
int n;
int f[maxn][maxn][2];
int aa[maxn][maxn];
bool ins[maxn][maxn][2];
inline int dp(int l, int r, int k) {
  assert(!ins[l][r][k]);
  assert(l <= r);
  ins[l][r][k] = true;
  if (~f[l][r][k]) {
    ins[l][r][k] = false;
    return f[l][r][k];
  }
  if (k && !aa[l][r]) {
    ins[l][r][k] = false;
    return 0;
  }
  if (l == r) {
    ins[l][r][k] = false;
    return 1;
  }
  f[l][r][k] = 0;
  if (!k) {
    for (int i = l; i < r; ++i) {
      f[l][r][k] += (long long)dp(l, i, 0) * dp(i, r, 1) % mod;
      {
        if (f[l][r][k] >= mod) {
          f[l][r][k] -= mod;
        }
      };
    }
  } else {
    for (int i = l; i < r; ++i) {
      f[l][r][k] += (long long)dp(l, i, 0) * dp(i + 1, r, 0) % mod;
      {
        if (f[l][r][k] >= mod) {
          f[l][r][k] -= mod;
        }
      };
    }
  }
  ins[l][r][k] = false;
  return f[l][r][k];
}
int main() {
  read(n);
  memset(f, 0xff, sizeof(f));
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      read(aa[i][j]);
    }
  }
  write(dp(1, n, 0));
  return 0;
}
