#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) { return; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  err(++it, args...);
}
const long long M = 1e5 + 5;
long long dp[M][(1 << 7)];
long long skill[M][7];
vector<long long> a(200100, 0);
bool comp(long long& i1, long long& i2) { return a[i1] > a[i2]; }
void upSolve() {
  long long n, p, k;
  cin >> n >> p >> k;
  vector<long long> idx(n + 1, 0);
  for (long long i = 1; i <= n; ++i) {
    cin >> a[i];
    idx[i] = i;
  }
  sort(begin(idx) + 1, begin(idx) + 1 + n, comp);
  for (long long i = 1; i <= n; ++i) {
    for (long long j = 0; j < p; ++j) {
      cin >> skill[i][j];
    }
  }
  memset(dp, -1, sizeof(dp));
  dp[0][0] = 0;
  for (long long mask = 0; mask < (1 << p); ++mask) {
    for (long long i = 1; i <= n; ++i) {
      long long x = idx[i];
      long long ct = __builtin_popcountll(mask);
      long long z = (i - 1) - ct;
      if (z < k) {
        if (dp[i - 1][mask] != -1) dp[i][mask] = dp[i - 1][mask] + a[x];
      } else {
        if (dp[i - 1][mask] != -1) dp[i][mask] = dp[i - 1][mask];
      }
      for (long long j = 0; j < p; ++j) {
        if ((mask & (1 << j)) && (dp[i - 1][mask ^ (1 << j)] != -1)) {
          long long z = dp[i - 1][mask ^ (1 << j)] + skill[x][j];
          dp[i][mask] = max(dp[i][mask], z);
        }
      }
    }
  }
  cout << dp[n][(1 << p) - 1] << endl;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  auto start = chrono::high_resolution_clock::now();
  upSolve();
  auto end = chrono::high_resolution_clock::now();
  cerr << " Execution time : "
       << chrono::duration_cast<chrono::milliseconds>(end - start).count()
       << "ms" << endl;
  return 0;
}
