#include <iostream>
#include <iomanip>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <map>
#include<unordered_map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include<bitset>
#include<deque>
#include<string>
#include<list>
#include<iterator>
#include<sstream>
#include <algorithm>
#include <numeric>
#include <math.h>

#define lli long long int
#define ld long double
#define ff first
#define ss second
#define lower(a) transform(a.begin(),a.end(),a.begin(),::tolower);

using namespace std;

const int N = 3e5 + 500;
const long long mod = 1e9 + 7;
const long long cmod = 998244353 ;
const long long inf = 1LL << 61;
const int M = 1e6 + 500;
const lli ths = 1LL << 40;
const int NN = 5e3 + 6;

lli n, m, k;
char a[11][1003];
lli dp[11][1003];
lli ans;

void f(string b) {
    vector<lli> v;
    for(int i = 0; i < b.size(); i ++) {
        if(b[i] == '1') {
            v.push_back(i);
        }
    }
    v.push_back(n - 1);
    lli now = v.size() - 1;
    lli X[v.size()] = {};
//    for(auto it : v)
//        cout<<it<<' ';
//    cout<<endl;
    vector<lli> pr;
    for(int i = 0; i < m; i ++) {
        pr.push_back(i);
        if(pr.size() > 4 && pr[pr.size() - 4] == pr.back()) {

//                cout<<"UES"<<endl;
//            cout<<i<<endl;
            return ;
        }
        lli prev = -1;
        for(int j = 0; j < v.size(); j ++ ) {
//                if(v.size() == 3) {
//                    cout<<"YES "<<v[j]<<endl;
//                    for(int k = 0; k < v.size(); k ++)
//                        cout<<X[k]<<' ';
//                    cout<<endl;
//                }
            lli cur = 0;
            if(prev == -1) {
                cur = dp[v[j]][i];
            }
            else {
                cur = dp[v[j]][i] - dp[prev ][i];
            }
            if(X[j] + cur > k) {
//                if(v.size() == 3)
//                    cout<<"NO"<<j<<' '<<cur<<endl;
                i --;
                memset(X, 0, sizeof X);
                now ++;
                break ;
            }
            else {
                X[j] += cur;
            }
//                            if(v.size() == 3) {
//            cout<<"CONT"<<endl;
//                    cout<<"YES "<<v[j]<<endl;
//                    for(int k = 0; k < v.size(); k ++)
//                        cout<<X[k]<<' ';
//                    cout<<endl;
//                }

            prev = v[j];
            if(now > ans)
                return ;
        }
    }
    ans = min(ans, now);
//    cout<<ans<<endl;
}

void mask(string ans = "") {
    if(ans.size() == n - 1) {
//        cout<<ans<<endl;
        f(ans);
        return ;
    }
    mask(ans + '0');
    mask(ans + '1');
    return ;
}

void solve()
{
    cin>>n>>m>>k;
    ans = n * m;
    for(int i = 0; i < n; i ++) {
        for(int j = 0; j < m; j ++)
            cin>>a[i][j];
    }
    for(int i = 0; i < m; i ++) {
        for(int j = 0; j < n; j ++) {
            if(j != 0)
                dp[j][i] += dp[j - 1][i] + (a[j][i] == '1');
            else
                dp[j][i] = (a[j][i] == '1');
        }
    }
//    for(int i = 0; i < n; i ++) {
//        for(int j = 0 ; j < m; j ++)
//            cout<<dp[i][j]<<' ';
//        cout<<endl;
//    }
    mask();
    cout<<ans;
    cout<<'\n';
    return ;
}



/*
3 3 1
101
101
101
*/

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    int t = 1;
//    cin>>t;
    while(t --)
    {
        solve();
    }
    return 0;
}


Measured memory_bytes: 384