#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x += _y;
  return _x >= _mod ? _x - _mod : _x;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x -= _y;
  return _x < 0 ? _x + _mod : _x;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x *= _y;
  return _x >= _mod ? _x % _mod : _x;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1LL;
  long long _ret = mypow(mul(_a, _a, _mod), _x >> 1, _mod);
  if (_x & 1) _ret = mul(_ret, _a, _mod);
  return _ret;
}
long long mymul(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 0LL;
  long long _ret = mymul(add(_a, _a, _mod), _x >> 1, _mod);
  if (_x & 1) _ret = add(_ret, _a, _mod);
  return _ret;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-9 && _x < _y + 1e-9;
}
void sleep(double sec = 1021) {
  clock_t s = clock();
  while (clock() - s < CLOCKS_PER_SEC * sec)
    ;
}
int __ = 1, _cs;
void build() {}
int n, a[514][514];
void init() {
  n = getint();
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) a[i][j] = getint();
}
int dp[514][514][2];
bool g[514][514][2];
int dp2[514][514];
bool g2[514][514];
int DP(int l, int r, int bt);
int DP2(int l, int r) {
  l %= n;
  r %= n;
  if ((l + 1) % n == r) return 1;
  if (l == r) return 1;
  if (g2[l][r]) return dp2[l][r];
  int ret = 0;
  ret = add(DP(r, l + 1, 0), DP(r + n - 1, l, 0));
  for (int i = l + 1; (i + 1) % n != r; i++)
    ret = add(ret, mul(DP(i, l, 0), DP(r, i + 1, 0)));
  g2[l][r] = true;
  return dp2[l][r] = ret;
}
int DP(int l, int r, int bt) {
  l %= n;
  r %= n;
  if (l == r) return 1;
  if (g[l][r][bt]) return dp[l][r][bt];
  int ret = 0;
  if (bt == 0) {
    for (int i = r;; i++) {
      if (i % n == l) break;
      if (!a[l % n][i % n]) continue;
      ret = add(ret, mul(DP(i, r, 0), DP(l, i, 1)));
    }
  } else {
    ret = DP(l + n - 1, r, 0);
    for (int i = r + 1;; i++) {
      if (i % n == l) break;
      if (!a[l % n][i % n]) continue;
      ret = add(ret, mul(DP(l, i, 1), DP2(r, i)));
    }
  }
  g[l][r][bt] = true;
  return dp[l][r][bt] = ret;
}
void solve() { printf("%d\n", DP(0, 1, 0)); }
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
