/*
TASK: tre
LANG: C
*/
#include <stdio.h>
#define INF (1<<30)
#define MAX(a,b) ((a) > (b) ? (a) : (b)) 
#define maxL 10005
#define maxD 105

typedef struct aaa {
        int gold, time;
        } node;

node F[maxL][maxD];
int A[maxL][maxD];
int n,d,k,l,best=-INF;

void input()
{
     int i,j;
     scanf("%d%d%d%d",&n,&k,&l,&d);
     for (i=1;i<=d;++i)
         for (j=1;j<=l;++j) scanf("%d",&A[i][j]);
     for (i=1;i<=d;++i)
         for (j=1;j<=l;++j) A[i][j] += A[i-1][j];
}

void solve()
{
     int i,j,p;
     for (i=1;i<=d;++i) {
         F[i][1].gold = A[i][1];
         F[i][1].time = i;
         }
     for (j=2;j<=l;++j)
         for (i=1;i<=d;++i) {
             for (p=1;p<=d;++p) 
                 if (F[p][j-1].time + i <= k)
                    {
                    if (F[p][j-1].gold + A[i][j] > F[i][j].gold) {
                       F[i][j].gold = F[p][j-1].gold + A[i][j];
                       F[i][j].time = F[p][j-1].time + i;
                       }
                    }
                 else F[i][j].time = INF;
             }
     for (i=1;i<=d;++i)
         for (j=1;j<=l;++j) if (F[i][j].time <= k) best = MAX(best, F[i][j].gold);
}

int main()
{
    input();
    solve();
    printf("%d\n",best);
    return 0;
}
