//本地自己写的,不知道A了多少
//动规,机器人走格子问题,这次要跳着走
int n;
cin >> n;
vector<vector<int>> M(n, vector<int>(n,0));
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> M[i][j];
}
}
vector<vector<int>> dp(n,vector<int>(n,0));
//初始化前两列
for (int i = 2; i < dp.size(); i += 2)
{
dp[i][0] = dp[i-2][0] + M[i-1][0];
dp[i][1] = dp[i-2][1] + M[i-1][1];
}
// i = i + 2
for (int i = 2; i < dp.size(); i += 2)
{
for (int j = 2; j < dp[i].size(); ++j)
{
int x = dp[i - 2][j] + M[i - 1][j];
int y = dp[i][j - 2] + M[i][j - 1];
dp[i][j] = min(dp[i-2][j]+M[i-1][j],dp[i][j-2]+M[i][j-1]);
}
}
for (int j = 0; j < dp[n - 1].size(); ++j)
{
dp[n - 1][j] = dp[n - 2][j] + M[n - 1][j];
}
vector<int> resdp(dp[n-1]);
sort(resdp.begin(), resdp.end());
cout << resdp[0] << "\n";