历届试题 最大子阵
2016-05-07 19:46
246 查看
问题描述
给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。
其中,A的子矩阵指在A中行和列均连续的一块。
输入格式
输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。
接下来n行,每行m个整数,表示矩阵A。
输出格式
输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。
样例输入
3 3
-1 -4 3
3 4 -1
-5 -2 8
样例输出
10
样例说明
取最后一列,和为10。
数据规模和约定
对于50%的数据,1<=n, m<=50;
对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。
这一题很简单不解释直接上代码
AC代码:
给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。
其中,A的子矩阵指在A中行和列均连续的一块。
输入格式
输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。
接下来n行,每行m个整数,表示矩阵A。
输出格式
输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。
样例输入
3 3
-1 -4 3
3 4 -1
-5 -2 8
样例输出
10
样例说明
取最后一列,和为10。
数据规模和约定
对于50%的数据,1<=n, m<=50;
对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。
这一题很简单不解释直接上代码
AC代码:
# include <cstdio> # include <cstring> int sum[510][510];//sum[i][j]表示第i列数下来第j个数总和 int a[510][510]; int main(){ int i, j, k, Max, temp_sum, n, m, Sum; scanf("%d%d", &n, &m); memset(sum, 0, sizeof(sum)); for(i=1; i<=n; i++){ for(j=1; j<=m; j++){ scanf("%d", &a[i][j]); sum[j][i]=sum[j][i-1]+a[i][j]; } } Max=-2000000000; for(i=1; i<=n; i++){ for(j=i; j<=n; j++){ temp_sum=0;Sum=-2000000000; for(k=1; k<=m; k++){ temp_sum=temp_sum+sum[k][j]-sum[k][i-1]; if(temp_sum>Sum){ Sum=temp_sum; } if(temp_sum<0){ temp_sum=0; } } if(Sum>Max){ Max=Sum; } } } printf("%d", Max); return 0; }
相关文章推荐
- Linux安装Java
- 2016.5.7
- hihocode #1299 打折机票
- 积性函数、线性筛、莫比乌斯反演和一堆乱七八糟的题目
- 学习进度条10
- ML—EM
- LeetCode-55.Jump Game
- java 单例模式(Singleton)
- MAC在Finder栏显示所浏览文件夹路径的方法
- ActionBar
- java.util.concurrent 使用详解
- EmguCV的学习日志(一)
- 白话设计——从类关系说起
- Android 5.0 Lollipop 短彩信接收流程
- Flask 数据库高级多对多关系
- Meanshift算法之再思考
- poj 2480 Longge's problem 欧拉函数+素数打表
- 猜读数
- 上机题目(初级)-大数求和
- 人月神话阅读笔记03