(题目描述略)

此题虽数据范围较小,但单纯的搜索算法仍不免超时。提高时间效率的办法仍然是以空间换时间,枚举行,预处理出子矩阵相邻元素的差值,再用动态转移求出选定行的分值最小的子矩阵。几乎多数基于二维矩阵的极值问题都可以用这种方法求解。

若选定的行数记为row[i] (i=[0,r)),选定行数第i列和第j列元素之差记为tempx[i][j] (i,j=[0,m)且i < j),第i列选定行数相邻行元素之差的和记为tempy[i] (i=[0,m)),设f[i][j]为前i+1列取j+1列且必取第i列的最小分值,边界f[0][0]=tempy[0],则动态转移方程如下:

f[0][0]=tempy[0]
f[i][i]=f[i-1][i-1]+tempx[i-1][i]+tempy[i] (i=(0,m))
f[i][j]=max(f[k][j-1]+tempx[k][i]+tempy[i]) (k=[j-1,i))

代码如下:

#include"stdio.h"
int f[20][20],matrix[20][20],n,r,row[20],tempx[20][20],tempy[20];
int abs(int x)
{return x<0?-x:x;
}
bool next()//求下一个行组合,不存在则返回true
{int t;for(t=r-1;t>=0;t--)if(row[t]<n-r+t)break;if(t<0)return true;for(row[t++]++;t<r;t++)row[t]=row[t-1]+1;return false;
}
int main()
{freopen("submatrix.in","r",stdin);freopen("submatrix.out","w",stdout);int ans=-1,c,m;scanf("%d %d %d %d",&n,&m,&r,&c);for(int i=0;i<n;i++)for(int j=0;j<m;j++)scanf("%d",&matrix[i][j]);for(int i=0;i<r;i++)row[i]=i;//初始化行while(true){for(int i=0;i<m;i++){tempy[i]=0;for(int j=i+1;j<m;j++){tempx[i][j]=0;for(int k=0;k<r;k++)tempx[i][j]+=abs(matrix[row[k]][i]-matrix[row[k]][j]);}for(int j=1;j<r;j++)tempy[i]+=abs(matrix[row[j-1]][i]-matrix[row[j]][i]);}//预处理,求tempx和tempyf[0][0]=tempy[0];for(int i=1;i<m;i++){f[i][i]=f[i-1][i-1]+tempx[i-1][i]+tempy[i];for(int j=i-1;j>0;j--){f[i][j]=f[j-1][j-1]+tempx[j-1][i]+tempy[i];for(int k=j;k<i;k++)if(f[i][j]>f[k][j-1]+tempx[k][i]+tempy[i])f[i][j]=f[k][j-1]+tempx[k][i]+tempy[i];}f[i][0]=tempy[i];if(i>=c-1&&(ans==-1||ans>f[i][c-1]))ans=f[i][c-1];}if(next())break;}printf("%d",ans);return 0;
}

NOIP2014P4 子矩阵 题解相关推荐

  1. P2331 [SCOI2005]最大子矩阵 题解

    DP 题,好像有点恶心,主要是因为能不能选空矩阵的问题. 有些数据好像是可以选空矩阵的有些又不能选,就很离谱,但是根据原数据来看空矩阵应该是不能选的,我也不知道具体情况() 注意到 m=1m=1m=1 ...

  2. CSUST 四月选拔赛个人题解

    CSUST 四月选拔赛个人题解 这场比赛演的逼真,感谢队友不杀之恩 总结:卡题了赶紧换,手上捏着的题尽快上机解决 http://csustacm.com:4803/ 1113~1122 1113:六学 ...

  3. 第十二届蓝桥杯c++b组个人题解

    又是一年一度的蓝桥杯了,本届蓝桥杯的题型分布有所改变,如果没记错的话往常都是3-5道填空题,今年一反往常只有2道填空题了,相对于之前的"暴力破解杯"和"dp杯" ...

  4. 2020牛客暑期多校训练营(第六场)

    2020牛客暑期多校训练营(第六场) 额,睡了一下午,直接错过了比赛... 文章目录 A African Sort 题意: 题解: 代码: B Binary Vector C Combination ...

  5. 题解:子矩阵(NOIP2014普及组T4)

    又是dp 暴力枚举会T 考虑先固定一个变量,比如先枚举行 然后预处理每行之间的绝对值,每列之间的绝对值 然后dp进行转移 注意记录选择的行数 转移记得加上新选的列的行之间的绝对值,即w[i], 1 # ...

  6. 【题解】洛谷P2331 最大子矩阵(dp 前缀和)

    对于m=1与m=2的情况分开单独处理,m=2注意有4种不同的状态 https://www.luogu.org/blog/ttt-ttt/solution-p2331 #include<cstdi ...

  7. 2019牛客全国多校训练三 题解

    A Gragh Games Unsolved. B Crazy Binary String 题解:水题,子序列只要统计0和1数量,取最小值然后乘2就是答案: 对于子串:先记录0和1 前缀和的差值,然后 ...

  8. 2020ICPC·小米 网络选拔赛第一场 全部题解

    整理的算法模板合集: ACM模板 目录 题目传送门 题目总体情况 A.Intelligent Warehouse B.Intelligent Robot C.Smart Browser D.Route ...

  9. BZOJ 1084: [SCOI2005]最大子矩阵【DP】

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MB Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得 ...

最新文章

  1. python可以播放音乐吗_详解python播放音频的三种方法
  2. sublime java cmd_在sublime text3设置java环境
  3. java sox语音_Sox语音转换的相关知识
  4. 苹果悬赏100万美元找漏洞 辞职的理由找到了!
  5. 双时隙的工作原理_双作用叶片泵工作原理是怎样的?作为8年工程师都没了解这么深...
  6. node.js 框架基本功能
  7. 尚硅谷python全套-尚硅谷Java视频教程,粉丝无数,人手一套尚硅谷教程
  8. tomcat日志配置-----自带log(一)
  9. Linux监控平台搭建二
  10. 3.如何使用EXCEL进行数据分析,得出相应的拟合公式
  11. [week9]签到题(长凳)——贪心算法
  12. pyppeteer 报 Execution context was destroyed, most likely because of a navigation
  13. K_A02_001 基于单片机驱动4位数码管模块(74HC595) 0-3滚动+ 时钟显示
  14. 状态同步和帧同步的优缺点
  15. 丘成桐中学生计算机科学竞赛,丘成桐中学生科学竞赛国内外赛区介绍
  16. eas报错日记_EAS_RPC日志收集方案
  17. 心血来潮在Linux上想整理普通用户,使用命令删除后,发现它还在?
  18. 互联网入侵教育培训业 在线教育优势弊端在哪?
  19. 软件测试专业职业访谈报告范文,第一部分:创业者访谈报告
  20. MATLAB官方权威免费视频教程(入门+深度学习)

热门文章

  1. Anaconda自用安装
  2. 22.【sinx幂级数求和】
  3. linux mint 17 输入法,LinuxMint17.1 Rebecca中安装设置输入法
  4. 在计算机术语中只读存储器常用,计算机应用基础复习题.doc
  5. zblog php换域名,zblog 怎么更换域名
  6. 不会聊天?不会撩妹?宅男如何走出自闭的循环圈
  7. 21个经典故事,值得收藏
  8. 课后实践10:以闲鱼为例,梳理产品功能结构迭代路径
  9. 软件工程之项目团队分工
  10. LoRaWAN入网方式以及加密进阶版