//本地自己写的,不知道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";