/*
TASK:tre
LANG:C++
*/

#include <iostream>
using namespace std;
int N,K,L,D,P[100][10002],T[1024],dolu[1024],bel[1024],end=0;
int b[1001][10001];
void rebuild()
{
     for(int i=1;i<=L;i++)
     {
             int curPr=0;
             int drCur=0;
             for(int j=1;j<=D;j++)
             {
                     if(P[j][i]<0) curPr+=P[j][i];
                     else
                     {
                         end++;
                         T[end]=P[j][i]+curPr+drCur;
                         dolu[end]=j;
                         drCur=T[end];
                         bel[end]=i;
                         curPr=0;
                     }
             }
     }
}
int B(int x,int y)
{
    if(y==0) return 0;
    if(x>end) return 0;

    int n=1;
    for(int i=x+1;bel[x]==bel[i];i++) n++;
    if(b[x+n][y]==-1) b[x+n][y]=B(x+n,y);
    int MAX=b[x+n][y];    
    for(int i=0;i<n;i++)
            if(y-dolu[x+i]>=0)
            {
                              if(b[x+n][y-dolu[x+i]]==-1) b[x+n][y-dolu[x+i]]=B(x+n,y-dolu[x+i]);
                       MAX=max(MAX,b[x+n][y-dolu[x+i]]+T[x+i]);
            }
return MAX;
}
        
int main()
{
    cin>>N>>K>>L>>D;
    for(int i=1;i<=D;i++)
            for(int j=1;j<=L;j++)
                    cin>>P[i][j];
          
    rebuild();
 
 
for(int i=0;i<=end+1;i++)
        for(int j=0;j<=K+1;j++) b[i][j]=-1;
            
    cout<<B(1,K)<<endl;
}
