#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <utility>
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
#define pb push_back
#define all(x) begin(x), end(x)
#define space " "
#define TEST_CASES int a; cin >> a; for (int i = 0; i < a; i++) {solve(); cout << endl;}
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());
void solve() {
int m, n, k; cin >> m >> n >> k;
vector<vector<int>> vec(m, vector<int>(n));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> vec[i][j];
}
}
vector<vector<int>> pref(m, vector<int>(n));
vector<vector<int>> amt(m, vector<int>(n));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
pref[i][j] = vec[i][j];
if (i) {
pref[i][j] += pref[i - 1][j];
}
if (j) {
pref[i][j] += pref[i][j - 1];
}
if (i && j) {
pref[i][j] -= pref[i - 1][j - 1];
}
if (i >= k - 1 && j >= k - 1) {
amt[i][j] = pref[i][j] - (i >= k ? pref[i - k][j] : 0) -
(j >= k ? pref[i][j - k] : 0) + (i >= k && j >= k ? pref[i - k][j - k] : 0);
}
}
}
vector<int> rmax(m); vector<int> cmax(n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
rmax[i] = max(rmax[i], amt[i][j]);
cmax[j] = max(cmax[j], amt[i][j]);
}
}
vector<vector<int>> rows(m, vector<int>(m)); vector<vector<int>> cols(n, vector<int>(n));
for (int i = k - 1; i < m; i++) {
rows[i][i] = rmax[i];
for (int j = i - 1; j >= k - 1; j--) {
rows[i][j] = max(rows[i][j], max(rows[i][j + 1], (i ? rows[i - 1][j] : 0)));
}
}
for (int i = k - 1; i < n; i++) {
cols[i][i] = cmax[i];
for (int j = i - 1; j >= k - 1; j--) {
cols[i][j] = max(cols[i][j], max(cols[i][j + 1], (i ? cols[i - 1][j] : 0)));
}
}
vector<vector<int>> tl(m, vector<int>(n)), tr(m, vector<int>(n)), bl(m, vector<int>(n)), br(m, vector<int>(n));
for (int i = k - 1; i < m; i++) {
for (int j = k - 1; j < n; j++) {
tl[i][j] = max(amt[i][j], max(i ? tl[i - 1][j] : 0, j ? tl[i][j - 1] : 0));
}
}
for (int i = m - 1; i >= k - 1; i--) {
for (int j = k - 1; j < n; j++) {
bl[i][j] = max(amt[i][j], max(i < m - 1 ? bl[i + 1][j] : 0, j ? bl[i][j - 1] : 0));
}
}
for (int i = k - 1; i < m; i++) {
for (int j = n - 1; j >= k - 1; j--) {
tr[i][j] = max(amt[i][j], max(i ? tr[i - 1][j] : 0, j < n - 1 ? tr[i][j + 1] : 0));
}
}
for (int i = m - 1; i >= k - 1; i--) {
for (int j = n - 1; j >= k - 1; j--) {
br[i][j] = max(amt[i][j], max(i < m - 1 ? br[i + 1][j] : 0, j < n - 1 ? br[i][j + 1] : 0));
}
}
int res = 0;
for (int i = k; i < m; i++) {
for (int j = k; j + k <= i; j++) {
res = max(res, rows[m - 1][i] + rows[i - k][j] + rows[j - k][k - 1]);
}
for (int j = k; j < n; j++) {
res = max(res, rows[m - 1][i] + tr[i - k][j] + tl[i - k][j - k]);
res = max(res, rows[i - k][k - 1] + br[i][j] + bl[i][j - k]);
res = max(res, cols[n - 1][j] + bl[i][j - k] + tl[i - k][j - k]);
res = max(res, cols[j - k][k - 1] + br[i][j] + tr[i - k][j]);
}
}
for (int i = k; i < n; i++) {
for (int j = k; j + k <= i; j++) {
res = max(res, cols[n - 1][i] + cols[i - k][j] + cols[j - k][k - 1]);
}
}
cout << res;
}
int main() {
FAST_IO;
//freopen("fortmoo.in", "r", stdin);
//freopen("fortmoo.out", "w", stdout);
//TEST_CASES;
solve(); //cout << endl;
/*int a; cin >> a;
for (int i = 1; i <= a; i++){
cout << "Case #" << i << ": ";
solve();
cout << endl;
}*/
}