#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000
int n, m, p;
int a[MAXN + 5][MAXN + 5];
int c[MAXN + 5];
int dp[MAXN + 5];
int sum[MAXN + 5][MAXN + 5];
deque<int> Q[MAXN + 5];
int main() {
scanf("%d%d%d", &n, &m, &p);
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
scanf("%d", &a[i][j]);
}
}
for (int j = 1; j <= m ; j ++) {
for (int i = 1; i <= n; i ++) {
sum[i][j] = sum[((i - 1) - 1 + n) % n + 1][j - 1] + a[i][j];
}
}
for (int i = 1; i <= n; i ++) {
scanf("%d", &c[i]);
}
for (int i = 1; i <= m; i ++) {
for (int j = 1; j <= n; j ++) {
while (!Q[j].empty() && Q[j].front() < max(i - p + 1, 1)) {
Q[j].pop_front();
}
int k = i;
while (!Q[j].empty() && ((dp[k - 1] - sum[((j - (i - k + 1) - 1 - 1) % n + n) % n + 1][k - 1] - c[((j - (i - k + 1) - 1 ) % n + n) % n + 1])) >= (dp[Q[j].back() - 1] - sum[((j - (i - Q[j].back() + 1) - 1 - 1) % n + n) % n + 1][Q[j].back() - 1] - c[((j - (i - Q[j].back() + 1) - 1 ) % n + n) % n + 1])) {
Q[j].pop_back();
}
Q[j].push_back(k);
k = Q[j].front();
dp[i] = max(dp[i], dp[k - 1] + sum[(j - 1 + n - 1)% n + 1][i] - sum[((j - (i - k + 1) - 1 - 1) % n + n) % n + 1][k - 1] - c[((j - (i - k + 1) - 1 ) % n + n) % n + 1]);
}
}
printf("%d", dp[m]);
return 0;
}