HDU 1081 To The Max
2015-06-02 20:12
302 查看
分析:题意是给你一个整型二维数组,让你求总和最大的子矩形。解法是将 求一维数组的最大的连续子序列 扩展成二维。
这是求一维数组的最大的连续子序列的代码:
现在我们让二维数组a[i][j]表示第i行,前i个元素的总和,那么原本数组的a[i][j],就是后来新生成数组的a[i][j]-a[i][j-1]。然后再求新的数组a的第j-i列的最大子序列的和,就表示原数组的第i列到第j列的最大子矩阵。
这是求一维数组的最大的连续子序列的代码:
# include <stdio.h> int main() { int i,n,sum,max,a[100]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); sum=0;max=0; for(i=0;i<n;i++) { sum+=a[i]; if(sum<0) sum=0; if(sum>max) max=sum; } printf("%d\n",max); } return 0; }
现在我们让二维数组a[i][j]表示第i行,前i个元素的总和,那么原本数组的a[i][j],就是后来新生成数组的a[i][j]-a[i][j-1]。然后再求新的数组a的第j-i列的最大子序列的和,就表示原数组的第i列到第j列的最大子矩阵。
# include <stdio.h> # include <string.h> int main() { int n,i,j,k,t,a[105][105],max,sum; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); a[i][j]+=a[i][j-1]; } for(i=0,max=0;i<n;i++) for(j=i+1;j<=n;j++) for(k=1,sum=0;k<=n;k++) { sum+=a[k][j]-a[k][i]; if(sum<0) sum=0; if(sum>max) max=sum; } printf("%d\n",max); } return 0; }
相关文章推荐
- 教你从redhat官网获取ISO镜像
- 二分法查找
- NEUQ 1397: 重建长城卷土重来
- node模块函数图解
- 【Hibernate学习笔记-6.1】无连接表的N-1关联(单向)
- leetcode_Number of 1 Bits_easy
- 面试题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- 分布式MySQL数据库TDSQL架构分析
- 凯云水利水电工程造价管理系统 技术解析(八) 机械单价(三)
- 003_01JavaScript之基础简介
- iOS-学习笔记-UI-第一天
- Centos6安装Qt5版本
- edx安装
- 欢迎使用CSDN-markdown编辑器
- response
- 会员卡管理系统技术解析(十)添加会员挂失恢复记录
- 8.16编写一个函数模板,使用冒泡法将数组内容从小排列到大
- Software-artifact Infrastructure Repository 学习笔记 2:C Object Handbooky
- [转]java多线程例子
- CS小分队第二阶段冲刺站立会议(6月2日)