#include <bits/stdc++.h>
using namespace std;
const int nmax = 7005;
int getLoss(vector< vector<int> > &mat, vector<int> &rows, int pos, int n, int m, int c){
int totalLoss = 0;
vector<int> losses(m);
for(const auto &row: mat){
for(int idx = 0; idx < m; idx++)
losses[idx] += row[idx];
}
for(auto idx: rows)
for(int jdx = 0; jdx < m; jdx++){
totalLoss += mat[idx][jdx];
losses[jdx] -= mat[idx][jdx];
}
sort(losses.begin(), losses.end());
for(int idx = 0; idx < c; idx++)
totalLoss += losses[idx];
return totalLoss;
}
void tryCombinations(vector< vector<int> > &mat, vector<int> &state, int pos, int n, int m, int r, int c, int &ans){
if(pos == r){
ans = min(ans, getLoss(mat, state, pos, n, m, c));
return;
}
int last = (pos == 0 ? 0 : state[pos - 1] + 1);
for(int newElement = last; newElement < n; newElement++){
state[pos] = newElement;
tryCombinations(mat, state, pos + 1, n, m, r, c, ans);
}
}
int getMinimumLoss(vector< vector<int> > &mat, int n, int m, int r, int c){
int res = (1<<30);
vector<int> state(r);
tryCombinations(mat, state, 0, n, m, r, c, res);
return res;
}
int main()
{
ifstream f("elimin.in");
ofstream g("elimin.out");
int n, m, r, c;
f>>n>>m>>r>>c;
vector< vector<int> > mat(min(n,m), vector<int>(max(n,m)));
int globalSum = 0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(n <= m) {
f>>mat[i][j];
globalSum += mat[i][j];
}
else {
f>>mat[j][i];
globalSum += mat[j][i];
}
}
if(n > m){
swap(n,m);
swap(r,c);
}
int minimumLoss = getMinimumLoss(mat, n, m, r, c);
g<<globalSum - minimumLoss;
return 0;
}