#include<bits/stdc++.h>
using namespace std;
struct Node{
int to,next,flow;
}edge[100000010];
int head[210],dep[210],tot=1,s,t;
void add(int from,int to,int flow){
edge[++tot].to=to,edge[tot].next=head[from],edge[tot].flow=flow,head[from]=tot;
edge[++tot].to=from,edge[tot].next=head[to],edge[tot].flow=0,head[to]=tot;
}
bool bfs(){
memset(dep,0,sizeof(dep));
queue<int>q;
q.push(s),dep[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to,f=edge[i].flow;
if(dep[v]==0&&f>0){
q.push(v);
dep[v]=dep[u]+1;
if(v==t)return true;
}
}
}
return false;
}
int dfs(int u,int flow){
if(u==t){
return flow;
}
int rest=flow;
for(int i=head[u];i&&rest;i=edge[i].next){
int v=edge[i].to,f=edge[i].flow;
if(dep[v]==dep[u]+1&&f>0){
int ff=dfs(v,min(rest,f));
if(ff==0)dep[v]=0;
rest-=ff;
edge[i].flow-=ff;
edge[i^1].flow+=ff;
}
}
return flow-rest;
}
int Dinic(){
int mxf=0,flow;
while(bfs()){
while(flow=dfs(s,2*1e9)){
mxf+=flow;
}
}
return mxf;
}
int main(){
s=1;
int n,p,q;
cin>>n>>p>>q;
t=2+2*n+p+q;
for(int i=1;i<=n;i++){
for(int j=1;j<=p;j++){
int px;
cin>>px;
if(px==1)add(j+1,p+1+i,1);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=q;j++){
int qx;
cin>>qx;
if(qx==1)add(1+n+p+i,j+1+2*n+p,1);
}
}
for(int i=1;i<=p;i++){
add(s,1+i,1);
}
for(int i=1;i<=q;i++){
add(1+p+2*n+i,t,1);
}
for(int i=1;i<=n;i++){
add(1+p+i,1+p+n+i,1);
}
cout<<Dinic()<<endl;
return 0;
}