#include <bits/stdc++.h>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, Min=INT_MAX;
    cin>>n;
    vector<vector<bool>> b(n,vector<bool>(n,true));
    vector<vector<int>> a(n,vector<int>(n));
    vector<vector<vector<int>>> dp(n,vector<vector<int>>(n,vector<int>(n)));
    vector<int> ip, jp;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            char c;
            cin>>c;
            if(c=='0')
            {
                b[i][j]=false;
                ip.push_back(i);
                jp.push_back(j);
            }
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            for(int k=0;k<ip.size() && b[i][j];k++)
                if(i+j>=abs(ip[k]-i)+abs(jp[k]-j))
                    b[i][j]=false;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>a[i][j];
    if(b[0][0])
        dp[0][0][0]=0;
    else
        dp[0][0][0]=a[0][0];
    for(int i=1;i<n;i++)
    {
        dp[i][0][0]=dp[i-1][0][0]+a[i][0];
        dp[0][i][0]=dp[0][i-1][0]+a[0][i];
        dp[0][0][i]=dp[0][0][0];
    }
    for(int k=0;k<n;k++)
    {
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<n;j++)
            {
                dp[i][j][k]=min(dp[i-1][j][k],dp[i][j-1][k]);
                if(!b[i][j])
                    dp[i][j][k]+=a[i][j];
            }
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(!b[i][j])
                {
                    int di={-1,0,0,1};
                    int dj={0,-1,1,0};
                    for(int l=0;l<4;l++)
                        if(di[l]>=0 && di[l]<n && dj[l]>=0 && dj[l]<n)
                            b[di[l]][dj[l]]=false;
                }
    }
    //debug
    for(int i=0;i<n;i++)
        Min=min(Min,dp[n-1][n-1][i]);
    cout<<Min;
    return 0;
}