#include #include #include using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); const long long MOD = 1000000007; int N; cin >> N; vector G(N); for (int i = 0; i < N; ++i) { cin >> G[i]; } vector> dp(N + 1, vector(N + 1, 0)); if (G[0][0] == G[N - 1][N - 1]) { dp[1][N] = 1; } for (int k = 0; k < N - 1; ++k) { vector> ndp(N + 1, vector(N + 1, 0)); for (int r1 = 1; r1 <= N; ++r1) { int c1 = k + 2 - r1; if (!(1 <= c1 && c1 <= N)) { continue; } for (int r2 = 1; r2 <= N; ++r2) { int c2 = 2 * N - k - r2; if (!(1 <= c2 && c2 <= N)) { continue; } long long cnt = dp[r1][r2]; if (cnt == 0) { continue; } vector> dir1 = {{1, 0}, {0, 1}}; vector> dir2 = {{-1, 0}, {0, -1}}; for (auto [dr1, dc1] : dir1) { for (auto [dr2, dc2] : dir2) { int nr1 = r1 + dr1; int nc1 = c1 + dc1; int nr2 = r2 + dr2; int nc2 = c2 + dc2; if (!(1 <= nr1 && nr1 <= N && 1 <= nc1 && nc1 <= N)) { continue; } if (!(1 <= nr2 && nr2 <= N && 1 <= nc2 && nc2 <= N)) { continue; } if (G[nr1 - 1][nc1 - 1] == G[nr2 - 1][nc2 - 1]) { ndp[nr1][nr2] = (ndp[nr1][nr2] + cnt) % MOD; } } } } } dp = ndp; } long long ans = 0; for (int r = 1; r <= N; ++r) { int c = N + 1 - r; if (1 <= c && c <= N) { ans = (ans + dp[r][r]) % MOD; } } cout << ans << "\n"; return 0; }