> 整体思路 以行作为标准 ,划分成多个 r 行的情况 再次处理每一列(计算每一列的分值和两列之间的分值) 再就以列为标准,进行线性dp
by Patchouli_Nine @ 2019-11-04 22:03:41
Dfs枚举选择的行和列,统计答案
by 7KByte @ 2019-11-04 22:03:58
@[Inf_Voltage](/space/show?uid=119261) 就是不知道如何枚举啊
@[帕秋莉_诺蕾姬](/space/show?uid=23207) 目前想先把暴力学会了。谢谢
by zhaowangji @ 2019-11-04 22:08:07
二进制$2^n$枚举
可以看看我的暴力:
[这里](https://www.luogu.org/paste/ntvnxeog)
by Keith_2006 @ 2019-11-04 22:16:56
@[Keith_2006](/user/106510) 谢谢,但您的代码。。。我真看不懂
by zhaowangji @ 2019-11-04 22:30:07
位运算太多,
~~~~当题解一定会被黑
by RAYMOND_7 @ 2019-11-07 21:10:47
三十分暴力代码:
```
#include<cstdio>
using namespace std;
int a[20][20],w1[20],w2[20],n,m,r,c,minn=1<<30;
int abs(int x){return x<0?-x:x;}
void dfs(int u1,int x,int u2,int y){
if(n-x+1+u1<r)return ;
if(m-y+1+u2<c)return;
if(x>n+1||y>m+1)return;
if(u1==r+1&&u2==c+1){
int sum=0;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
if(i!=r)sum+=abs(a[w1[i]][w2[j]]-a[w1[i+1]][w2[j]]);
if(j!=c)sum+=abs(a[w1[i]][w2[j]]-a[w1[i]][w2[j+1]]);
}
}
if(sum<minn)minn=sum;
return;
}
if(u1<=r){
dfs(u1,x+1,u2,y);
w1[u1]=x;
dfs(u1+1,x+1,u2,y);
}
if(u2<=c){
dfs(u1,x,u2,y+1);
w2[u2]=y;
dfs(u1,x,u2+1,y+1);
}
}
int main(){
//freopen("submatrix.in","r",stdin);
//freopen("submatrix.out","w",stdout);
scanf("%d %d %d %d",&n,&m,&r,&c);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
dfs(1,1,1,1);
printf("%d\n",minn);
return 0;
}
```
by wind_cross @ 2019-11-11 21:58:36