#include <bits/stdc++.h>
using namespace std;
constexpr int N = 500 + 10, P = 1e9 + 7;
int n;
int a[N][N];
int dp[N][N][3];
void Add(int &first, int second) {
  if ((first += second) >= P && (first -= P))
    ;
}
int DP(int l, int r, int v) {
  if (v == 0 || v == 1) {
    if (l >= r) return 1;
  } else {
    if (l + 1 >= r) return 1;
  }
  int &res = dp[l][r][v];
  if (res != -1) return res;
  res = 0;
  if (v == 0) {
    for (int i = l + 1; i <= r; i++) {
      if (a[l][i]) Add(res, 1ll * DP(i, r, 0) * DP(l, i, 2) % P);
    }
  }
  if (v == 1) {
    for (int i = l; i <= r - 1; i++) {
      if (a[r][i]) Add(res, 1ll * DP(l, i, 1) * DP(i, r, 2) % P);
    }
  }
  if (v == 2) {
    for (int i = l + 1; i <= r - 1; i++) {
      if (a[l][i]) Add(res, 1ll * DP(i, r, 2) * DP(l, i, 2) % P);
    }
    for (int i = l + 1; i <= r - 1; i++) {
      if (a[r][i]) Add(res, 1ll * DP(i, r, 2) * DP(l + 1, i, 1) % P);
    }
  }
  return res;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  memset(dp, -1, sizeof(dp));
  cin >> n;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cin >> a[i][j];
    }
  }
  int ans = 0;
  for (int i = 2; i <= n; i++) {
    if (a[1][i]) {
      Add(ans, 1ll * DP(i, n, 0) * DP(1, i, 2) % P);
    }
  }
  cout << ans << endl;
  return 0;
}
