这题的暴力如何写?

P2258 [NOIP2014 普及组] 子矩阵

> 整体思路 以行作为标准 ,划分成多个 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


|