#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
int sum=0;
bool neg=0;
char ch=getchar();
while(ch<'0' || '9'<ch){
if(ch=='-') neg=1;
ch=getchar();
}
while('0'<=ch && ch<='9'){
sum=(sum<<1)+(sum<<3)+(ch^'0');
ch=getchar();
}
return neg?-sum:sum;
}
int n,k,A,B,C;
int Map[105][105];
int dis[105][105][15];
bool vis[105][105][15];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct node{
int x,y;
int fuel;
int dis;
node(int xx,int yy,int ff,int cc){
x=xx;
y=yy;
fuel=ff;
dis=cc;
}
node();
friend bool operator <(node a,node b){
return a.dis>b.dis;
}
};
priority_queue<node>q;
void bfs(){
memset(dis,127,sizeof(dis));
q.push(node(1,1,k,0));
dis[1][1][k]=0;
while(!q.empty()){
node now=q.top();
q.pop();
int fuel=now.fuel;
if(vis[now.x][now.y][fuel]) continue;
vis[now.x][now.y][fuel]=1;
if(fuel == 0){
if(now.dis+A+C < dis[now.x][now.y][k]){
q.push(node(now.x,now.y,k,now.dis+A+C));
dis[now.x][now.y][k]=now.dis+A+C;
}
continue;
}
for(int i=0;i<4;i++){
int nx=now.x+dir[i][0];
int ny=now.y+dir[i][1];
int tmp1=now.dis;
int tmp2=now.dis+A;
if(i>=2){
tmp1+=B;
tmp2+=B;
}
if(nx<1 || nx>n || ny<1 || ny>n) continue;
if(Map[nx][ny]==0 && tmp1 < dis[nx][ny][fuel-1]){
dis[nx][ny][fuel-1]=tmp1;
q.push(node(nx,ny,fuel-1,tmp1));
}
if(Map[nx][ny]==1 && tmp2 < dis[nx][ny][k]){
dis[nx][ny][k]=tmp2;
q.push(node(nx,ny,k,tmp2));
}
}
}
return;
}
signed main(){
n=read(),k=read(),A=read(),B=read(),C=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
Map[i][j]=read();
}
}
bfs();
int ans=INT_MAX;
for(int i=1;i<=k;i++){
ans=min(ans,dis[n][n][i]);
}
printf("%lld",ans);
return 0;
}
萌新调不出来qaq