#include<cstdio>
#include<cstring>
using namespace std;
int coin[1001][1001],cost[1001],f[1001][1001],step[1001][1001],past[1001],i,j,k,m,n,p,pastmax=0,nowmax;
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&coin[j][i]);
for(i=1;i<=n;i++)scanf("%d",&cost[i]);
memset(f,0,sizeof(f));
memset(step,0xfffff,sizeof(step));
for(i=2;i<=n;i++)past[i]=i-1;
past[1]=n;
nowmax=-0xfffff;
for(j=1;j<=n;j++)
{
step[1][j]=1;
f[1][j]=pastmax-cost[past[j]]+coin[1][past[j]];
if(f[1][j]>nowmax)nowmax=f[1][j];
}
pastmax=nowmax;
for(i=2;i<=m;i++)
{
nowmax=-0xfffff;
for(j=1;j<=n;j++)
{
if(step[i-1][past[j]]<p)
{
if(pastmax-cost[past[j]]>f[i-1][past[j]])
{
step[i][j]=1;
f[i][j]=pastmax-cost[past[j]]+coin[i][past[j]];
}
else
{
step[i][j]=step[i-1][past[j]]+1;
f[i][j]=f[i-1][past[j]]+coin[i][past[j]];
}
}
else
{
step[i][j]=1;
f[i][j]=pastmax-cost[past[j]]+coin[i][past[j]];
}
if(f[i][j]>nowmax)nowmax=f[i][j];
}
pastmax=nowmax;
}
printf("%d\n",nowmax);
return 0;
}
C++AC无障碍!