NOIP2014P4 子矩阵 题解
(题目描述略)
此题虽数据范围较小,但单纯的搜索算法仍不免超时。提高时间效率的办法仍然是以空间换时间,枚举行,预处理出子矩阵相邻元素的差值,再用动态转移求出选定行的分值最小的子矩阵。几乎多数基于二维矩阵的极值问题都可以用这种方法求解。
若选定的行数记为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 子矩阵 题解相关推荐
- P2331 [SCOI2005]最大子矩阵 题解
DP 题,好像有点恶心,主要是因为能不能选空矩阵的问题. 有些数据好像是可以选空矩阵的有些又不能选,就很离谱,但是根据原数据来看空矩阵应该是不能选的,我也不知道具体情况() 注意到 m=1m=1m=1 ...
- CSUST 四月选拔赛个人题解
CSUST 四月选拔赛个人题解 这场比赛演的逼真,感谢队友不杀之恩 总结:卡题了赶紧换,手上捏着的题尽快上机解决 http://csustacm.com:4803/ 1113~1122 1113:六学 ...
- 第十二届蓝桥杯c++b组个人题解
又是一年一度的蓝桥杯了,本届蓝桥杯的题型分布有所改变,如果没记错的话往常都是3-5道填空题,今年一反往常只有2道填空题了,相对于之前的"暴力破解杯"和"dp杯" ...
- 2020牛客暑期多校训练营(第六场)
2020牛客暑期多校训练营(第六场) 额,睡了一下午,直接错过了比赛... 文章目录 A African Sort 题意: 题解: 代码: B Binary Vector C Combination ...
- 题解:子矩阵(NOIP2014普及组T4)
又是dp 暴力枚举会T 考虑先固定一个变量,比如先枚举行 然后预处理每行之间的绝对值,每列之间的绝对值 然后dp进行转移 注意记录选择的行数 转移记得加上新选的列的行之间的绝对值,即w[i], 1 # ...
- 【题解】洛谷P2331 最大子矩阵(dp 前缀和)
对于m=1与m=2的情况分开单独处理,m=2注意有4种不同的状态 https://www.luogu.org/blog/ttt-ttt/solution-p2331 #include<cstdi ...
- 2019牛客全国多校训练三 题解
A Gragh Games Unsolved. B Crazy Binary String 题解:水题,子序列只要统计0和1数量,取最小值然后乘2就是答案: 对于子串:先记录0和1 前缀和的差值,然后 ...
- 2020ICPC·小米 网络选拔赛第一场 全部题解
整理的算法模板合集: ACM模板 目录 题目传送门 题目总体情况 A.Intelligent Warehouse B.Intelligent Robot C.Smart Browser D.Route ...
- BZOJ 1084: [SCOI2005]最大子矩阵【DP】
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MB Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得 ...
最新文章
- python可以播放音乐吗_详解python播放音频的三种方法
- sublime java cmd_在sublime text3设置java环境
- java sox语音_Sox语音转换的相关知识
- 苹果悬赏100万美元找漏洞 辞职的理由找到了!
- 双时隙的工作原理_双作用叶片泵工作原理是怎样的?作为8年工程师都没了解这么深...
- node.js 框架基本功能
- 尚硅谷python全套-尚硅谷Java视频教程,粉丝无数,人手一套尚硅谷教程
- tomcat日志配置-----自带log(一)
- Linux监控平台搭建二
- 3.如何使用EXCEL进行数据分析,得出相应的拟合公式
- [week9]签到题(长凳)——贪心算法
- pyppeteer 报 Execution context was destroyed, most likely because of a navigation
- K_A02_001 基于单片机驱动4位数码管模块(74HC595) 0-3滚动+ 时钟显示
- 状态同步和帧同步的优缺点
- 丘成桐中学生计算机科学竞赛,丘成桐中学生科学竞赛国内外赛区介绍
- eas报错日记_EAS_RPC日志收集方案
- 心血来潮在Linux上想整理普通用户,使用命令删除后,发现它还在?
- 互联网入侵教育培训业 在线教育优势弊端在哪?
- 软件测试专业职业访谈报告范文,第一部分:创业者访谈报告
- MATLAB官方权威免费视频教程(入门+深度学习)