#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9;
const long long mod = 998244353;
long long dp[N][1 << 7];
int s[N][1 << 7], st[N], Log[1 << 7];
struct node {
  int v, id;
} a[N];
bool cmp(node a, node b) { return a.v > b.v; }
void upd(long long &a, long long b) {
  if (a < b) a = b;
}
int main() {
  int n, p, k;
  for (int i = (1); i < (N); ++i) st[i] = st[i >> 1] + (i & 1);
  for (int i = (0); i < (7); ++i) Log[1 << i] = i;
  scanf("%d%d%d", &n, &p, &k);
  for (int i = (1); i < (n + 1); ++i) {
    scanf("%d", &a[i].v);
    a[i].id = i;
  }
  sort(a + 1, a + 1 + n, cmp);
  int op = (1 << p) - 1;
  for (int i = (1); i < (n + 1); ++i)
    for (int j = (0); j < (p); ++j) scanf("%d", &s[i][j]);
  for (int i = (1); i < (p + k + 1); ++i) {
    for (int mask = (0); mask < (1 << p); ++mask) {
      if (st[mask] > i - 1) continue;
      upd(dp[i - st[mask]][mask], dp[i - st[mask] - 1][mask] + a[i].v);
      int pos = op ^ mask;
      while (pos) {
        upd(dp[i - st[mask] - 1][mask | ((pos) & (-pos))],
            dp[i - st[mask] - 1][mask] + s[a[i].id][Log[((pos) & (-pos))]]);
        pos ^= ((pos) & (-pos));
      }
    }
  }
  for (int i = (p + k + 1); i < (n + 1); ++i) {
    for (int mask = (1 << p) - 1; mask >= (0); --mask) {
      int pos = mask;
      while (pos) {
        upd(dp[k][mask],
            dp[k][mask ^ ((pos) & (-pos))] + s[a[i].id][Log[((pos) & (-pos))]]);
        pos ^= ((pos) & (-pos));
      }
    }
  }
  printf("%lld", dp[k][op]);
}
