//题意:n个数,给数字0填上(1~m),使得minimum number of contiguous groups为k的代价最小
//2,1,1,1,3,2,2,3,1,3 k=7
//dp[i][j][k] 前i个数&&第i个数颜色为k时,group为j时的最小代价
//决策为a[i]是否等于a[i-1];
//a[n]为0时
//相同则为dp[i][j][k]=dp[i-1][j][k]+p[i][k]
//不同则为dp[i][j][k]=min(dp[i-1][j-1][l])+p[i][k] (k!=l&&l=1~m)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e2+20;
const ll inf=ll(1e18);
ll a[N],n,m,K;
ll p[N][N];//p[i][j] 给第i个数上颜色j的代价
ll dp[N][N][N];
int main()
{
while(cin>>n>>m>>K)
{
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>p[i][j];
for(int i=0;i<=n;i++)
for(int j=0;j<=K;j++)
for(int k=0;k<=m;k++)
dp[i][j][k]=inf;
if(a[1])
dp[1][1][a[1]]=0;
else
{
for(int k=1;k<=m;k++)
{
dp[1][1][k]=p[1][k];
}
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=K;j++)
{
//决策为a[i]是否等于a[i-1];
if(a[i]==0)
{
for(int k=1;k<=m;k++)
{
dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]+p[i][k]);
for(int l=1;l<=m;l++)
{
if(l!=k)
dp[i][j][k]=min(dp[i][j][k],dp[i-1][j-1][l]+p[i][k]);
}
}
}
else
{
dp[i][j][a[i]]=min(dp[i][j][a[i]],dp[i-1][j][a[i]]);
for(int l=1;l<=m;l++)
{
if(l!=a[i])
{
dp[i][j][a[i]]=min(dp[i][j][a[i]],dp[i-1][j-1][l]);
}
}
}
}
}
ll ans=inf;
for(int k=1;k<=m;k++)
{
ans=min(dp[n][K][k],ans);
}
if(ans<inf)
cout<<ans<<endl;
else
puts("-1");
}
return 0;
}