//分组背包问题,首先考虑一个木板的情况:
//对于一个木板而言:dp[i][j],i表示当前是第i次粉刷,粉刷第j块格子的情况。
//那么得到状态转移方程为:dp[i][j] = max(dp[i-1][l]+num[l+1][j])。
//其中num[l+1][j]表示在l到j这个区间里面最大的有效格子是多少。
//然后将其扩展到多个木板即在一维加上木板。
//dp[k][i][j]。
//首选一次动态规划求出每一个木板涂i次的最好情况。
//dp[k][i][j] = max(dp[k][i-1][l]+num[l+1][j]);
//然后用每个木块的最终结果做第二次总的动态规划
#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
int n, m, t;
int num[maxn][maxn][maxn];
int dp[maxn][2500+10][maxn];
int ans[maxn][2500+10];
void calc(int pos, string s)
{
int len = s.size();
for (int i=1;i<=len-1;i++)
{
for (int j=i;j<=len-1;j++)
{
int cnt1 = 0, cnt2 = 0;
for (int k=i;k<=j;k++)
{
if (s[k]=='0') cnt1++;
if (s[k]=='1') cnt2++;
}
num[pos][i][j] = max(cnt1, cnt2);
}
}
}
int main(){
cin>>n>>m>>t;
for (int i=1;i<=n;i++)
{
string s;
cin>>s;
s = " "+s;
calc(i, s);
}
//进行第一次针对于各个木板的动态规划
for (int k=1;k<=n;k++)
{
for (int i=1;i<=t;i++)
{
for (int j=1;j<=m;j++)
{
for (int l=1;l<=j;l++)
{
dp[k][i][j] = max(dp[k][i][j], dp[k][i-1][l-1]+num[k][l][j]);
}
}
}
}
// for (int k=1;k<=n;k++)
// {
// for (int i=1;i<=t;i++)
// {
// cout<<dp[k][i][m]<<endl;
// }
// }
//dp[k][i][m] = max(dp[k-1][i-l][m]+dp[k][l][m]);
for (int k=1;k<=n;k++)
{
for (int i=1;i<=t;i++)
{
for (int l=1;l<=i;l++)
{
ans[k][i] = max(ans[k][i], ans[k-1][i-l]+dp[k][l][m]);
// cout<<"k="<<k<<' '<<ans[k][i][m]<<endl;
// cout<<dp[k-1][i-l][m]<<' '<<dp[k][l][m]<<endl;
}
}
}
cout<<ans[n][t]<<endl;
return 0;
}