var i,j,k,n,v,b:longint;
f:array[0..10]of longint;
a:array[1..10,1..100]of longint;
function max(x,y:longint):longint;
begin
if x>y then max:=x
else max:=y;
end;
begin
readln(v,n,b);
for i:=1 to n do
for j:=1 to v do
read(a[i,j]);
for i:=1 to n do
for j:=v downto 0 do
for k:=1 to v do
if j-k-b>=0 then
f[j]:=max(f[j],f[j-k-b]+a[i,k])
else f[j]:=f[j];
write(f[v]);
end.
var i,j,n,s,na,k:longint;
a:array[1..100]of longint;
f:array[0..100]of int64;
begin
readln(s,n,na);
for i:=1 to n do begin
for j:=1 to s do read(a[j]);
readln;
for j:=s downto 0 do
//枚举总时间做j分钟,之所以倒序,是因为前面的结果会影响后面的结果,顺序的话就不
//是最优值了
for k:=1 to j-na do
//na是写名字的时间,枚举做试卷的时间k,a[k]是做k分钟得的分数
if a[k]+f[j-k-na]>f[j] then
//因为k+na不一定把时间用完,为了最优,就要把剩下总时间的最优值f[j-k-na]加上现在
//科目的分数a[k]
f[j]:=a[k]+f[j-k-na];
//与之前算到的最优值比较,取更优的值,为后面的运算做铺垫
end;
//提醒一下,f数组是储存总科目的优值,而a数组只是暂时存一下当前科目每分钟的分数
writeln(f[s]);
//因为s是总时间,所以总时间的最优值就是结果
end.