#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 100500, MAXP = 7;
long long a[MAXN];
long long s[MAXN][MAXP];
const long long MAX_MASK = (1 << MAXP) - 1;
long long dp[3 * MAXP * MAXP + 1][MAX_MASK + 1][3 * MAXP * MAXP + 1];
const long long INF = (long long)1e15;
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  long long n, p, k;
  cin >> n >> p >> k;
  for (long long i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < p; j++) {
      cin >> s[i][j];
    }
  }
  vector<pair<long long, long long>> boba;
  for (long long i = 0; i < n; i++) {
    boba.emplace_back(a[i], i);
  }
  sort(boba.begin(), boba.end());
  reverse(boba.begin(), boba.end());
  set<long long> possible;
  for (long long j = 0; j < p; j++) {
    vector<pair<long long, long long>> now;
    for (long long i = 0; i < n; i++) {
      now.emplace_back(-s[i][j], i);
    }
    sort(now.begin(), now.end());
    for (long long i = 0; i < min(p, n); i++) {
      possible.insert(now[i].second);
    }
  }
  for (long long j = 0; j < p; j++) {
    vector<pair<long long, long long>> now;
    for (long long i = k; i < n; i++) {
      now.emplace_back(-s[boba[i].second][j], boba[i].second);
    }
    sort(now.begin(), now.end());
    for (long long i = 0; i < min(p, (long long)now.size()); i++) {
      possible.insert(now[i].second);
    }
  }
  for (long long j = 0; j < p; j++) {
    vector<pair<long long, long long>> now;
    for (long long i = 0; i < n; i++) {
      now.emplace_back(a[i] - s[i][j], i);
    }
    sort(now.begin(), now.end());
    for (long long i = 0; i < min(p, n); i++) {
      possible.insert(now[i].second);
    }
  }
  vector<pair<long long, long long>> other;
  for (long long i = 0; i < n; i++) {
    if (possible.find(i) == possible.end()) {
      other.emplace_back(a[i], i);
    }
  }
  sort(other.begin(), other.end());
  reverse(other.begin(), other.end());
  vector<long long> psb;
  for (long long i : possible) {
    psb.push_back(i);
  }
  long long m = psb.size();
  long long max_mask = (1 << p) - 1;
  for (long long mask = 0; mask <= max_mask; mask++) {
    for (long long j = 0; j <= m; j++) {
      dp[0][mask][j] = -INF;
    }
  }
  dp[0][0][0] = 0;
  for (long long i = 1; i <= m; i++) {
    for (long long mask = 0; mask <= max_mask; mask++) {
      for (long long j = 0; j <= m; j++) {
        dp[i][mask][j] = dp[i - 1][mask][j];
        for (long long bit = 0; bit < p; bit++) {
          if ((mask & (1 << bit)) == 0) {
            continue;
          }
          long long prev_mask = (mask ^ (1 << bit));
          if (dp[i - 1][prev_mask][j] != -INF) {
            dp[i][mask][j] = max(dp[i][mask][j],
                                 dp[i - 1][prev_mask][j] + s[psb[i - 1]][bit]);
          }
        }
        if (j > 0 && dp[i - 1][mask][j - 1] != -INF) {
          dp[i][mask][j] =
              max(dp[i][mask][j], dp[i - 1][mask][j - 1] + a[psb[i - 1]]);
        }
      }
    }
  }
  long long res = 0;
  for (long long j = 0; j <= min(m, k); j++) {
    long long left = k - j;
    if (left > (long long)other.size()) {
      continue;
    }
    long long sm = 0;
    for (long long i = 0; i < left; i++) {
      sm += other[i].first;
    }
    res = max(res, dp[m][max_mask][j] + sm);
  }
  cout << res << '\n';
}
