#include <iostream>
#define INF 100000;
using namespace std;
int main()
{
int N,K,A,B,C;
cin>>N>>K>>A>>B>>C;
int a[N+1][N+1];//N*N的那个网格
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j)
cin>>a[i][j];
int f[N+1][N+1][3];
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j)
{f[i][j][0]=INF;f[i][j][1]=K;}//初始化
int s[4][3]={{-1,0,0},{0,-1,0},{1,0,B},{0,1,B}};//4个方向,第三个参数是价格B
f[1][1][0]=0;f[1][1][1]=K;//起点值初始化
for(int x=1;x<=N;++x)
for(int y=1;y<=N;++y)
{
if(x==1&&y==1) continue;
int minmoney=INF;int minstep;//minmoney存储(x,y)上个位置的最小money
int tmpmoney,tmpstep;
for(int i=0;i<=3;++i)//遍历上一个位置的所有可能情况
{ if(x+s[i][0]<1||x+s[i][0]>N||y+s[i][1]<1||y+s[i][1]>N) continue;//超边界
tmpmoney=f[x+s[i][0]][y+s[i][1]][0]+s[i][2];
tmpstep=f[x+s[i][0]][y+s[i][1]][1]-1;
if(a[x][y]==1) {tmpmoney+=A;tmpstep=K;} //遇油站
if(a[x][y]==0&&tmpstep==0&&(x!=N||y!=N)) {tmpmoney+=A+C;tmpstep=K;}//没油了
if(minmoney>tmpmoney)//更新最小值 (最后储存上个位置中费用最少的)
{
minmoney=tmpmoney;
minstep=tmpstep;
}
}
if(f[x][y][0]>minmoney)//更新f
{
f[x][y][0]=minmoney;
f[x][y][1]=minstep;
}
}
cout<<endl;
cout<<f[N][N][0];
}