数据太水了,这样写都能 A(不能 A 的地方放注释了):
#include<bits/stdc++.h>
using namespace std;
int n,m,a[20][20],p,q,bz=2e9,dp[20][20][20];
vector<int> q1;
inline int dd(int x,int y,int ls){
if(x==q)
return 0;
if(dp[x][y][ls]!=-1)
return dp[x][y][ls];
if(!ls){
for(int i=y;i<=m-(q-x)+1;++i){
int ans=0;
for(int j=1;j<p;++j)
ans+=abs(a[q1[j]][i]-a[q1[j-1]][i]);
if(dp[x][y][ls]==-1)
dp[x][y][ls]=ans+dd(x+1,i+1,i);
else
dp[x][y][ls]=min(dp[x][y][ls],ans+dd(x+1,i+1,i));
if(dp[x][y][ls]<=10)//
return dp[x][y][ls];//
}
} else{
for(int i=y;i<=m-(q-x)+1;++i){
int ans=abs(a[q1[0]][i]-a[q1[0]][ls]);
for(int j=1;j<p;++j)
ans+=abs(a[q1[j]][i]-a[q1[j-1]][i])+abs(a[q1[j]][i]-a[q1[j]][ls]);
if(dp[x][y][ls]==-1)
dp[x][y][ls]=ans+dd(x+1,i+1,i);
else
dp[x][y][ls]=min(dp[x][y][ls],ans+dd(x+1,i+1,i));
if(dp[x][y][ls]<=10)//
return dp[x][y][ls];//
}
}
return dp[x][y][ls];
}
inline void dfs(int x,int k){
if(x){
for(int i=k;i<=n-x+1;++i){
q1.push_back(i);
dfs(x-1,i+1);
q1.pop_back();
}
return;
}
memset(dp,-1,sizeof(dp));
bz=min(bz,dd(0,1,0));
}
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
int res=0;
char ch=gc();
while(ch<'0'||ch>'9')
ch=gc();
while(ch>='0'&&ch<='9'){
res=(res<<1)+(res<<3)+(ch^'0');
ch=gc();
}
return res;
}
int main(){
n=read(),m=read(),p=read(),q=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
a[i][j]=read();
dfs(p,1);
printf("%d\n",bz);
return 0;
}