#include<bits/stdc++.h>
#define ll long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)
using namespace std;
const int N=100005, M=1<<9, K=8;
int n, p, k, mx;
ll Ans=-1ll<<60, L, f[M], g[M][K];
struct node {
ll a, s[K];
bool operator<(const node &rhs) const { return a>rhs.a; }
} qwq[N];
inline int max(int a,int b) { return a>b?a:b; }
inline ll max(ll a,ll b) { return a>b?a:b; }
signed main() {
memset(f,-127,sizeof(f)), memset(g,-127,sizeof(g));
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> p >> k, mx=(1<<p)-1;
up(i,1,n) cin >> qwq[i].a;
up(i,1,n) up(j,0,p-1) cin >> qwq[i].s[j];
sort(qwq+1,qwq+1+n); up(i,1,k) L+=qwq[i].a;
f[0]=g[0][0]=0;
up(i,1,k) dn(s,mx,0) up(j,0,p-1) if(s>>j&1) f[s]=max(f[s],f[s^(1<<j)]+qwq[i].s[j]-qwq[i].a);
up(i,k+1,n) {
dn(s,mx,0) dn(j,p,0) {
if(j) g[s][j]=max(g[s][j],g[s][j-1]+qwq[i].a);
up(o,0,p-1) if(s>>o&1) g[s][j]=max(g[s][j],g[s^(1<<o)][j]+qwq[i].s[o]);
}
}
up(l,0,mx) {
int cnt=0, tmp=l;
while(tmp) ++cnt, tmp-=tmp&-tmp;
Ans=max(Ans,L+f[l]+g[mx^l][cnt]);
}
cout << Ans;
return 0;
}