#include <bits/stdc++.h>
using namespace std;
void ga(int N, int *A) {
  for (int i(0); i < N; i++) scanf("%d", A + i);
}
long long dp[512][512][2], S;
int N, g[512][512];
long long dyn(int b, int e, bool x) {
  long long &v = dp[b][e][x];
  if (~v) return v;
  v = 0;
  if (b < e) {
    if (e - b == 1) return v = 1;
    if (!x)
      for (int k(b + 1); k < e; k++) {
        if (g[b][k]) v = (v + dyn(b, k, 0) * dyn(k, e, 0)) % 1000000007;
      }
    else
      for (int k(b + 1); k < e; k++)
        if (g[k][e]) v = (v + dyn(b, k, 1) * dyn(k, e, 0)) % 1000000007;
    if (!x) v += dyn(b, e, 1);
  } else {
    if (e + N - b == 1) return v = 1;
    if (!x)
      for (int k(b + 1); k < e + N; k++) {
        if (g[b][k % N])
          v = (v + dyn(b, k % N, 0) * dyn(k % N, e, 0)) % 1000000007;
      }
    else
      for (int k(b + 1); k < e + N; k++)
        if (g[k % N][e])
          v = (v + dyn(b, k % N, 1) * dyn(k % N, e, 0)) % 1000000007;
    if (!x) v += dyn(b, e, 1);
  }
  return v;
}
int main(void) {
  scanf("%d", &N), (memset(dp, -1, sizeof(dp)));
  for (int i(0); i < N; i++) ga(N, g[i]);
  for (int k(1); k < N; k++)
    if (g[0][k]) S += dyn(0, k, 1) * dyn(k, 0, 0) % 1000000007;
  printf("%lld\n", S % 1000000007);
  return 0;
}
