#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
int n;
char t[501][501];
int dp[501][501][501];
int calc(int x1, int y1, int x2) {
if(dp[x1][y1][x2]!=-1) return dp[x1][y1][x2];
int y2=(n-1)-((x1+y1)-(n-1-x2));
if(x1>x2 || y1>y2) return 0; //important optimalization!
if(x1+y1==(n-1))
{
if(x1!=x2 || y1!=y2) return 0;
else return 1;
}
if(t[x1][y1]!=t[x2][y2]) return 0;
long long ans=0;
ans+=calc(x1+1,y1,x2);
ans%=mod;
ans+=calc(x1+1,y1,x2-1);
ans%=mod;
ans+=calc(x1,y1+1,x2);
ans%=mod;
ans+=calc(x1,y1+1,x2-1);
ans%=mod;
return dp[x1][y1][x2]=ans;
}
int main() {
memset(dp, -1, sizeof dp);
cin>>n;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
cin>>t[i][j];
cout<<calc(0,0,n-1)<<"\n";
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtb2Q9MTAwMDAwMDAwNzsKaW50IG47CmNoYXIgdFs1MDFdWzUwMV07CmludAlkcFs1MDFdWzUwMV1bNTAxXTsKaW50IGNhbGMoaW50IHgxLCBpbnQgeTEsIGludCB4MikgewoJaWYoZHBbeDFdW3kxXVt4Ml0hPS0xKSByZXR1cm4gZHBbeDFdW3kxXVt4Ml07CglpbnQgeTI9KG4tMSktKCh4MSt5MSktKG4tMS14MikpOwoJaWYoeDE+eDIgfHwgeTE+eTIpIHJldHVybiAwOyAvL2ltcG9ydGFudCBvcHRpbWFsaXphdGlvbiEKCWlmKHgxK3kxPT0obi0xKSkgCgl7CgkJaWYoeDEhPXgyIHx8IHkxIT15MikgcmV0dXJuIDA7CgkJZWxzZSByZXR1cm4gMTsKCX0KCWlmKHRbeDFdW3kxXSE9dFt4Ml1beTJdKSByZXR1cm4gMDsKCQoJbG9uZyBsb25nIGFucz0wOwoJYW5zKz1jYWxjKHgxKzEseTEseDIpOwoJYW5zJT1tb2Q7CglhbnMrPWNhbGMoeDErMSx5MSx4Mi0xKTsKCWFucyU9bW9kOwoJYW5zKz1jYWxjKHgxLHkxKzEseDIpOwoJYW5zJT1tb2Q7CglhbnMrPWNhbGMoeDEseTErMSx4Mi0xKTsKCWFucyU9bW9kOwoJCglyZXR1cm4gZHBbeDFdW3kxXVt4Ml09YW5zOwp9CgppbnQgbWFpbigpIHsKCW1lbXNldChkcCwgLTEsIHNpemVvZiBkcCk7CgljaW4+Pm47Cglmb3IoaW50IGk9MDtpPG47KytpKQoJCWZvcihpbnQgaj0wO2o8bjsrK2opCgkJCWNpbj4+dFtpXVtqXTsKCQkJCgljb3V0PDxjYWxjKDAsMCxuLTEpPDwiXG4iOwoJcmV0dXJuIDA7Cn0K