#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 20001, M = 50, inf = 2e9;
signed main()
{
int n,m,s;
cin>>m>>n>>s;
int a[n], b[m][n], pre[n+1]={};
for (int i=0;i<n;i++)
cin>>a[i], pre[i+1]=pre[i]+a[i];
for (int i=0;i<m;i++)
{
string s;
cin>>s;
for (int j=0;j<n;j++)
b[i][j]=s[j]-'0' ;
}
int dp[n+1][s+1]={}, prem[n+1][s+1];
for (int i=0;i<=n;i++)
for (int j=0;j<=s;j++) dp[i][j]=prem[i][j]=inf;
dp[0][0]=prem[0][0]=0;
for (int x=1;x<=s;x++)
{
int ls[m]={};
multiset<int> se={0};
for (int i=0;i<m;i++) ls[i]=-1;
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
if (!b[j][i])
{
if (~ls[j]) se.erase(se.find(ls[j]));
ls[j]=i, se.insert(ls[j]);
}
int op=se.size();
for (int o:se)
{
int su=0, mn=i;
for (int j=0;j<m;j++) su+=(pre[i+1]-pre[o])*(o>ls[j]);
dp[i+1][x]=min(dp[i+1][x],su+dp[o][x-1]);
if (o==i) continue;
su=0;
for (int j=0;j<m;j++) su+=(pre[i+1]-pre[o+1])*(o+1>ls[j]), mn=min(mn,ls[j]);
dp[i+1][x]=min(dp[i+1][x],su+dp[o][x-1]);
}
if (se.size()==m+1)
dp[i+1][x]=min(dp[i+1][x],prem[*se.begin()][x-1]);
prem[i+1][x]=min(prem[i][x],dp[i+1][x]);
}
cout<<dp[n][x]<<endl;
}
return 0;
}