显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#define ll long long
using namespace std;
const int maxn=10010,maxm=1<<5;
inline ll read(){
int x=0,ju=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')ju=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return ju*x;
}
int n,m,cnt,a[maxn][5],b[maxn][5],el[maxn][5],ed[maxn][5];
int e[maxm],g[maxm],Log[maxm],cur[maxn];
ll f[2][maxm],ans;
int main(){
freopen("chessboardd.in","r",stdin);
freopen("chessboardd.out","w",stdout);
n=read();m=read();
for(int i=0;i<n;i++)for(int j=1;j<=m;j++)a[j][i]=read();
for(int i=0;i<n;i++)for(int j=1;j<=m;j++)b[j][i]=read();
for(int i=0;i<n;i++)for(int j=2;j<=m;j++)el[j][i]=read();
for(int i=0;i<n;i++)for(int j=1;j<=m;j++)ed[j][i]=read();
for(int i=0;i<n;i++)Log[1<<i]=i;
for(int d=0;d<20;d++){
memset(f[0],0,maxm*8);
for(int l=1;l<=m;l++){
int fl=l&1;
memset(f[fl],0x3f,maxm*8);
memset(e,0,sizeof(e));
memset(g,0,sizeof(g));
for(int i=0;i<(1<<n);i++)
for(int k=0;k<n;k++){
if(((i>>k)^(a[l][k]>>d))&1)g[i]+=b[l][k];
if(((i>>k)^((i>>((k+1)%n))))&1)g[i]+=ed[l][k];
if((i>>k)&1)e[i]+=el[l][k];
}
for(int i=0;i<(1<<n);i++)
for(int j=0;j<(1<<n);j++)
f[fl][i]=min(f[fl][i],f[fl^1][j]+g[i]+e[i^j]);
}
int fl=m&1;
ll t=0x3f3f3f3f3f3f3f3fll;
for(int i=0;i<(1<<n);i++)t=min(t,f[fl][i]);
ans+=t<<d;
}
printf("%lld\n",ans);
return 0;
}