#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define fr(i,j,k) for(i = j; i < (k); i++)
#define all(x) x.begin(), x.end()
#define el '\n'
#define remax(a,b) a = max(a, b)
#define remin(a,b) a = min(a, b)
#define sz(x) int32_t(x.size())

typedef long double ld;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vpi;
// --------------------------------------------------------------------

const pii dxy[] = { {-1, 0}, {1, 0}, {0, 1}, {0, -1} };
const int mod = 1e9 + 7;
const int inf = 2e18;
const ld eps = 1e-9;
const int NN = 1e5 + 2;

//======================================
string to_string(string s) {
	return '"' + s + '"';
}
string to_string(const char* s) {
	return to_string((string) s);
}
string to_string(bool b) {
	return (b ? "true" : "false");
}
template <typename A, typename B>
string to_string(pair<A, B> p) {
	return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A>
string to_string(A v) {
	bool first = true;  string res = "{";
	for (const auto &x : v) {
		if (!first) { res += ", "; }
		first = false; res += to_string(x);
	}
	res += "}";       return res;
}
void debug_out() {
	cerr << endl;
}
template <typename Head, typename ... Tail>
void debug_out(Head H, Tail... T) {
	cerr << " " << to_string(H);
	debug_out(T ...);
}

// #define TRACE

#ifdef TRACE
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(_VA_ARGS_)
#else
#define debug(...)
#endif
// =================================================


vvi a;

void solve() {
	int i = 0, j = 0, k = 0, n = 0, m = 0;
	cin >> n >> m >> k;
      a.assign(n, vi(m));
	fr(i, 0, n) {
            // a.pb(vi(m));
            string s; cin >> s;
		fr(j, 0, m) {
			a[i][j] = s[j] - '0';
		}
	}
      debug(a);
	int horizCuts = 1 << (n - 1), ans = inf;
	debug(horizCuts);
      for(int se = 0; se < horizCuts; se++) {
		int numComps = __builtin_popcount(se) + 1;
		vi components(numComps, 0);
		bool can = 1;
            int numCuts = numComps - 1;
            debug(se, numComps);
		for(int leftBorder = 0; leftBorder < m; leftBorder++) {
			int thisAdd = 0, currComp = 0;
			vi newComponents(numComps);
			for(int downShift = 0; downShift < n; downShift++) {
				thisAdd += a[downShift][leftBorder];
				if((1<<downShift) & se) {
					newComponents[currComp] = thisAdd;
					currComp++;
					thisAdd = 0;
				}
			}
			newComponents[currComp] = thisAdd;
			// check if exceeds any component
			int maxComp = 0;
			for(i = 0; i < numComps; i++) {
				remax(maxComp, components[i] + newComponents[i]);
                        if(newComponents[i] > k) {
                              can = 0;
                              break;
                        }
			}
                  if(!can) break;
			if(maxComp > k) {
				numCuts++;
                        fr(i, 0, numComps) {
                              components[i] = newComponents[i];
                        }
			} else {
                        fr(i, 0, numComps) {
                              components[i] += newComponents[i];
                        }
                  }
                  debug(maxComp, numCuts, newComponents);
		}
            if(can) {
                  remin(ans, numCuts);
            }
            debug(ans, numCuts);
	}
      cout << ans<<el;
}

int32_t main() {
	ios::sync_with_stdio(false); cin.tie(0);
	int T = 1;
	// cin >> T;
	for(int tc = 1; tc <= T; tc++) {
		solve();
	}

	return 0;
}

Measured memory_bytes: 384