#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<set>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
using namespace std;
inline int R(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);
}
inline void writesp(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);putchar(32);
}
inline void writeln(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);putchar(10);
}
inline char read(){
char ch=getchar();
while(1) ch=getchar();
return ch;
}
const int N=1e7+5,M=105,V=0x3f3f3f3f;
int n,m,k,oilcost,drivecost,buildcost;
int b[M][M];
namespace MCMF{
int S,T;
struct edge{
int to,nxt,w,cost;
}a[N];
int head[N],cnt=1;
int ans;
int dis[N],dinic[N],e[N],pre[N];
bool vis[N];
void add(int x,int y,int z,int c){
cnt++;
a[cnt].nxt=head[x];
a[cnt].to=y;
a[cnt].w=z;
a[cnt].cost=c;
head[x]=cnt;
}
void new_add(int x,int y,int z,int c){
add(x,y,z,c);
add(y,x,0,-c);
}
bool spfa(){
for(int i=1;i<=m;i++) dis[i]=dinic[i]=V,vis[i]=0;
queue<int>q;
vis[S]=1;
q.push(S);
dis[S]=0;
while(!q.empty()){
int now=q.front();
q.pop();
vis[now]=0;
for(int i=head[now];i;i=a[i].nxt){
int u=a[i].to;
if(a[i].w&&dis[u]>dis[now]+a[i].cost){
dis[u]=dis[now]+a[i].cost,pre[u]=now,e[u]=i,dinic[u]=min(dinic[now],a[i].w);
if(!vis[u]){
vis[u]=1;
q.push(u);
}
}
}
}
return dis[T]!=V;
}
void mcmf(){
while(spfa()){
int p=T;
ans+=dis[T]*dinic[T];
while(p!=S){
a[e[p]].w-=dinic[T];
a[e[p]^1].w+=dinic[T];
p=pre[p];
}
}
}
}
using namespace MCMF;
int calc(int x,int y){
return (x-1)*n+y;
}
int main(){
n=R(),k=R(),oilcost=R(),drivecost=R(),buildcost=R(),S=(k+1)*n*n+1,T=m=(k+1)*n*n+2;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=R();
for(int i=0;i<=k;i++){
for(int x=1;x<=n;x++){
for(int y=1;y<=n;y++){
if(b[x][y]) new_add(i*n*n+calc(x,y),calc(x,y),1,oilcost);
else new_add(i*n*n+calc(x,y),calc(x,y),1,oilcost+buildcost);
if(i!=k){
if(y+1<=n) new_add(i*n*n+calc(x,y),(i+1)*n*n+calc(x,y+1),1,0);
if(x+1<=n) new_add(i*n*n+calc(x,y),(i+1)*n*n+calc(x+1,y),1,0);
if(y-1>=1) new_add(i*n*n+calc(x,y),(i+1)*n*n+calc(x,y-1),1,drivecost);
if(x-1>=1) new_add(i*n*n+calc(x,y),(i+1)*n*n+calc(x-1,y),1,drivecost);
}
}
}
new_add((i+1)*n*n,T,1,0);
}
new_add(S,1,1,0);
mcmf();
write(ans);
}