#include <bits/stdc++.h>
using namespace std;
bool RELAXED = false;
template <int, typename T>
struct MINMAX {
  T val;
  MINMAX(T val) : val(val) {}
};
template <typename T>
MINMAX<1, T> MAX(T val) {
  return MINMAX<1, T>(val);
};
template <typename T>
MINMAX<2, T> MIN(T val) {
  return MINMAX<2, T>(val);
};
template <typename T, typename U>
inline T& operator|=(T& lhs, MINMAX<1, U> rhs) {
  return lhs = (rhs.val > lhs ? (RELAXED = true, rhs.val)
                              : (RELAXED = false, lhs));
}
template <typename T, typename U>
inline T& operator|=(T& lhs, MINMAX<2, U> rhs) {
  return lhs = (rhs.val < lhs ? (RELAXED = true, rhs.val)
                              : (RELAXED = false, lhs));
}
template <typename T, typename U>
istream& operator>>(istream& in, pair<T, U>& p) {
  in >> p.first >> p.second;
  return in;
}
template <typename T>
inline vector<T> READ(int n) {
  vector<T> vec(n);
  for (int i = 0; i < int(n); i++) cin >> vec[i];
  return vec;
}
template <typename T>
using min_heap = priority_queue<T, vector<T>, greater<T> >;
signed long long int dp[140];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, p, k;
  cin >> n >> p >> k;
  vector<pair<int, int> > audp;
  for (int i = 0; i < int(n); i++) {
    int a;
    cin >> a;
    audp.push_back({a, i});
  }
  sort((audp).begin(), (audp).end());
  reverse((audp).begin(), (audp).end());
  vector<vector<int> > st;
  for (int i = 0; i < int(n); i++) st.push_back(READ<int>(p));
  memset(dp, 0x80, sizeof dp);
  dp[0] = 0;
  for (int i = 0; i < int(n); i++) {
    int aidx = audp[i].second;
    int ai = audp[i].first;
    vector<int>& si = st[aidx];
    for (int bm = 0; bm < int(1 << p); bm++) {
      int exAdd = (i - __builtin_popcount(bm)) < k ? ai : 0;
      dp[bm] += exAdd;
    }
    for (int s = 0; s < int(p); s++) {
      int sbit = 1 << s;
      for (int bm = 0; bm < int(1 << p); bm++) {
        bm |= sbit;
        int exAdd = (i - __builtin_popcount(bm - sbit)) < k ? ai : 0;
        signed long long int inVal = dp[bm - sbit] - exAdd + si[s];
        dp[bm] |= MAX(inVal);
      }
    }
  }
  signed long long int ans = dp[(1 << p) - 1];
  cout << ans << endl;
}
