#include <bits/stdc++.h>

using namespace std;

struct elem
{
    int ocean=true;
    int tox;
};


void rek(elem (&a)[],int x,int y,int n);

int main()
{
    iostream::sync_with_stdio(false);

    int n;
    cin >> n;
    elem a[n+1][n+1];
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            char x;
            cin >> x;
            if(x=='0')a[i][j].ocean=false;
        }
    }
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            int x;
            cin >> x;
            a[i][j].tox=x;
        }
    }


    int x=1,y=1;
    int res=0;
    if(a[x][y].ocean==false)res+=a[x][y].tox;
    while(x!=n && y!=n)
    {
        if(x==n) // right edge
        {
            if(a[x+1][y].tox>0)y++;
            else if(a[x+1][y].tox<0 && a[x+1][y].ocean==false)y++;
        }
        else if(y==n) // bottom edge
        {
            if(a[x][y+1].tox>0)x++;
            else if(a[x][y+1].tox<0 && a[x][y+1].ocean==false)x++;
        }
        else // everything else
        {
            if(a[x+1][y].tox<0 && a[x][y+1].tox<0) // both clean
            {
                if(a[x+1][y].tox<a[x][y+1].tox)
                {
                    if(a[x+1][y].ocean==false)y++;
                }
                else if(a[x+1][y].tox>a[x][y+1].tox)
                {
                    if(a[x][y+1].ocean==false)x++;
                }
                else x++;
            }
            else if(a[x+1][y].tox<0 && a[x][y+1].tox>0)// bottom cleans
            {
                if(a[x+1][y].ocean==false)y++;
            }
            else if(a[x+1][y].tox>0 && a[x][y+1].tox<0)// right cleans
            {
                if(a[x][y+1].ocean==false)x++;
            }
            else // none clean
            {
                if(a[x+1][y].ocean==true)y++;
                else if(a[x][y+1].ocean==true)x++;
                else if(a[x+1][y].tox<a[x][y+1].tox)y++;
                else if(a[x+1][y].tox>a[x][y+1].tox)x++;
                else x++;
            }
        }

        if(a[y][x].ocean==false)res+=a[y][x].tox;

        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(a[i][j].ocean==true)
                {
                    if(i>1)
                        if(a[i-1][j].ocean==false)a[i][j].ocean=false;
                    if(j>1)
                        if(a[i][j-1].ocean==false)a[i][j].ocean=false;
                    if(i<n)
                        if(a[i+1][j].ocean==false)a[i][j].ocean=false;
                    if(j<n)
                        if(a[i][j+1].ocean==false)a[i][j].ocean=false;
                }
            }
        }

    }
    if(a[n][n].ocean==false)res+=a[n][n].tox;
    cout << res << endl;

    return 0;
}