动态规划-最大子矩阵和(ZOJ 1074 TO THE MAX )
2016-06-21 15:04
281 查看
题目:
有一个包含正数和负数的二维数组。一个子矩阵是指在该二维数组里,任意相邻的下标是1×1或更大的子数组。一个子矩阵的和是指该子矩阵中所有元素的和。本题中,把具有最大和的子矩阵称为最大子矩阵。例如,如下数组的最大子矩阵位于左下角,其和为15。
输入
是N×N个整数的数组。第一行是一个正整数N,表示二维方阵的大小。接下来是N2个整数(由空格和换行隔开)。该数组的N2个整数,是以行序给出的。先是第一行的数,由左到右;然后是第二的数,由左到右,等等。N可能达到100,数组元素的范围是[-127,127]。输出:
输出是最大子矩阵的和。思路:
1、此问题是“最大字段和”问题的推广。2、代码具体过程如下:
代码:
#include<cstdio> #include<cstring> int n; int a[110][110]; int b[110]; int main() { while(scanf("%d",&n)!=EOF) { for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d",&a[i][j]); int Max = -32767; for(int i=0; i<n; i++) { //数组b表示i~j行,对应列元素的和 //将二维动态规划问题转化为一维动态规划问题 memset(b, 0, sizeof(b)); for(int j=i; j<n; j++) { //下面是针对数组b求最大子段和的动态规划算法 int sum=0; for(int k=0; k<n; k++) { b[k] += a[j][k]; sum += b[k]; if(sum<0) sum = b[k]; if(sum>Max) Max = sum; } } } printf("%d\n",Max); } return 0; }
相关文章推荐
- Aliyun linux5.7 64位安装 reids3.2.1
- SpringMVC 过滤参数的非法字符
- IIS错误手册
- Javascript点击其他任意地方隐藏关闭DIV实例
- Android—第三方登录—界面跳转细节处理
- java的注释和分隔符
- RTMP流媒体播放过程
- iOS动画学习笔记4 Video Tutorial iOS Animation with Swift - Ray Wenderlich
- android-R.styleable(应用)
- python logging 转载
- Could not find bundle: org.eclipse.equinox.console
- g++和gcc的比较
- 使用Golang利用ectd实现一个分布式锁
- ListView滚动状态的监听器AbsListView.OnScrollListener
- 重载求最大值
- leetcode——Word Search
- python之map映射
- Spring+Redis+ShardedJedis
- 用storyboard与代码创建一个简单的求和计算器
- 当前时间设置