#include <bits/stdc++.h>
using namespace std;

#define rep(i, N) for (int i = 0; i < N; i++)
#define rep1(i, N) for (int i = 1; i <= N; i++)
const int intinf = numeric_limits<int>::max();
#define MOD 1000000007

using ll = long long int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

template <typename T>
bool chmax(T &m, const T q)
{
    if (m < q)
    {
        m = q;
        return true;
    }
    else
        return false;
}
template <typename T>
bool chmin(T &m, const T q)
{
    if (m > q)
    {
        m = q;
        return true;
    }
    else
        return false;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) { return {l.first + r.first, l.second + r.second}; }
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) { return {l.first - r.first, l.second - r.second}; }
template <typename T>
istream &operator>>(istream &is, vector<T> &vec)
{
    for (auto &v : vec)
        is >> v;
    return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &vec)
{
    os << "[";
    for (auto v : vec)
        os << v << ",";
    os << "]";
    return os;
}
template <typename T>
ostream &operator<<(ostream &os, const deque<T> &vec)
{
    os << "deq[";
    for (auto v : vec)
        os << v << ",";
    os << "]";
    return os;
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &vec)
{
    os << "{";
    for (auto v : vec)
        os << v << ",";
    os << "}";
    return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &vec)
{
    os << "{";
    for (auto v : vec)
        os << v << ",";
    os << "}";
    return os;
}
template <typename T>
ostream &operator<<(ostream &os, const multiset<T> &vec)
{
    os << "{";
    for (auto v : vec)
        os << v << ",";
    os << "}";
    return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_multiset<T> &vec)
{
    os << "{";
    for (auto v : vec)
        os << v << ",";
    os << "}";
    return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &pa)
{
    os << "(" << pa.first << "," << pa.second << ")";
    return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const map<TK, TV> &mp)
{
    os << "{";
    for (auto v : mp)
        os << v.first << "=>" << v.second << ",";
    os << "}";
    return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp)
{
    os << "{";
    for (auto v : mp)
        os << v.first << "=>" << v.second << ",";
    os << "}";
    return os;
}

template <typename T>
void reset(vector<T> &v, const T reset_to)
{
    for (auto &x : v)
        x = reset_to;
}

#define dbg(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ") " << __FILE__ << endl;

void solve()
{
    int H, W, K;
    cin >> H >> W >> K;
    vector<string> S(H);
    cin >> S;
    vector<vector<int>> s(H, vector<int>(W));
    rep(i, H) rep(j, W) s[i][j] = S[i][j] - '0';

    int ans = (H - 1) * (W - 1);

    rep(a, 1 << (H - 1))
    {
        int ncut = __builtin_popcount(a);
        int ans_a = ncut;
        const int h = ncut + 1;

        vector<vector<int>> bigs(h, vector<int>(W, 0));
        int bigi = 0;
        rep(i, H)
        {
            rep(j, W)
                bigs[bigi][j] += s[i][j];
            if ((a >> i) & 1)
                bigi++;
        }

        bool is_impossible = false;
        vector<int> bigk(h, 0);
        rep(j, W)
        {
            bool is_ok = true;
            rep(bigi, h)
            {
                if (bigk[bigi] + bigs[bigi][j] > K)
                {
                    is_ok = false;
                    break;
                }
            }
            if (!is_ok)
            {
                ans_a++;
                reset(bigk, 0);
            }
            rep(bigi, h)
            {
                bigk[bigi] += bigs[bigi][j];
                if (bigs[bigi][j] > K)
                {
                    is_impossible = true;
                    ans_a = (H - 1) * (W - 1);
                    break;
                }
            }
        }

        chmin(ans, ans_a);
    }
    cout << ans << endl;
}

pii test(pii a, pii b)
{
    return {a.first, b.second};
}

int main()
{
    solve();

    return 0;
}


Measured memory_bytes: 384