#include <bits/stdc++.h>   using namespace std;   template <typename A, typename B>   string to_string(pair<A, B> p);   template <typename A, typename B, typename C>   string to_string(tuple<A, B, C> p);   template <typename A, typename B, typename C, typename D>   string to_string(tuple<A, B, C, D> p);   string to_string(const string& s) { return     + s +    ; }   string to_string(const char* s) { return to_string((string)s); }   string to_string(bool b) { return (b ?  true  :  false ); }   string to_string(vector<bool> v) {     bool first = true;     string res =  { ;     for (int i = 0; i < static_cast<int>(v.size()); i++) {       if (!first) {         res +=  ,  ;       }       first = false;       res += to_string(v[i]);     }     res +=  } ;     return res;   }   template <size_t N>   string to_string(bitset<N> v) {     string res =   ;     for (size_t i = 0; i < N; i++) {       res += static_cast<char>( 0  + v[i]);     }     return res;   }   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;   }   template <typename A, typename B>   string to_string(pair<A, B> p) {     return  (  + to_string(p.first) +  ,   + to_string(p.second) +  ) ;   }   template <typename A, typename B, typename C>   string to_string(tuple<A, B, C> p) {     return  (  + to_string(get<0>(p)) +  ,   + to_string(get<1>(p)) +  ,   +            to_string(get<2>(p)) +  ) ;   }   template <typename A, typename B, typename C, typename D>   string to_string(tuple<A, B, C, D> p) {     return  (  + to_string(get<0>(p)) +  ,   + to_string(get<1>(p)) +  ,   +            to_string(get<2>(p)) +  ,   + to_string(get<3>(p)) +  ) ;   }   void debug_out() { cerr << endl; }   template <typename Head, typename... Tail>   void debug_out(Head H, Tail... T) {     cerr <<     << to_string(H);     debug_out(T...);   }   const int mod = 1e9 + 7;   const int inf = 1 << 30;   const int maxn = 505;   int n, m, k;   int cuantas[maxn], tomar[maxn][maxn], dp[maxn][maxn];   vector<int> pos[maxn];   int solve(int i, int f) {     if (f > k) return inf;     if (i > n) return 0;     int& res = dp[i][f];     if (res != -1) return res;     res = inf;     for (int j = 0; j <= cuantas[i]; j++) {       int faltar = cuantas[i] - j;       if (f + faltar <= k) {         res = min(res, solve(i + 1, f + faltar) + tomar[i][j]);       }     }     return res;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cin >> n >> m >> k;     for (int i = 1; i <= n; i++) {       string s;       cin >> s;       for (int j = 0; j < m; j++) {         if (s[j] ==  0 ) continue;         pos[i].push_back(j);       }       cuantas[i] = (int)pos[i].size();     }     for (int i = 1; i <= n; i++) {       for (int tam = 1; tam <= cuantas[i]; tam++) {         tomar[i][tam] = inf;         for (int j = 0; j < cuantas[i]; j++) {           if (j + tam - 1 >= cuantas[i]) break;           tomar[i][tam] = min(tomar[i][tam], pos[i][j + tam - 1] - pos[i][j] + 1);         }       }     }     memset(dp, -1, sizeof(dp));     cout << solve(1, 0) <<   n ;     return 0;   }