#include<bits/stdc++.h> #define FILE "read" #define INF 1e9 #define cmin(a,b) a=min(a,b) #define cmax(a,b) a=max(a,b) using namespace std; int n,m,ans,a[105][105],pre[105][105],f[105][105][105][4]; inline int read(){ int x=0,f=1; char ch=getchar(); while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } int solve(int i,int l,int r,int k){ if(f[i][l][r][k]!=-1) return f[i][l][r][k]; if(i==n) return f[i][l][r][k]=0; if(k==0){ f[i][l][r][k]=INF; if(l-1>=1) cmin(f[i][l][r][k],solve(i,l,r,2)+a[i][l-1]); if(r+1<=m) cmin(f[i][l][r][k],solve(i,l,r,3)+pre[i][r+1]-pre[i][l]); } else if(k==1){ f[i][l][r][k]=INF; if(l-1>=1) cmin(f[i][l][r][k],solve(i,l,r,2)+pre[i][r-1]-pre[i][l-2]); if(r+1<=m) cmin(f[i][l][r][k],solve(i,l,r,3)+a[i][r+1]); } else if(k==2){ cmax(f[i][l][r][k],solve(i+1,l-1,l-2,3)+a[i+1][l-1]); if(!(l==2&&r==m)) cmax(f[i][l][r][k],solve(i,l-1,r,0)); } else if(k==3){ cmax(f[i][l][r][k],solve(i+1,r+1,r,3)+a[i+1][r+1]); if(!(l==1&&r==m-1)) cmax(f[i][l][r][k],solve(i,l,r+1,1)); } return f[i][l][r][k]; } void clear(){ ans=INF; memset(f,-1,sizeof(f)); memset(pre,0,sizeof(pre)); } void solve(){ n=read(); m=read(); clear(); for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)a[i][j]=read(); for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)pre[i][j]=pre[i][j-1]+a[i][j]; for(int i=1;i<=m;++i)cmin(ans,solve(1,i,i-1,3)+a[1][i]); printf("%d\n",ans); } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); for(int T=read();T;--T) solve(); return 0; }
|