最大子矩阵和
来源:互联网 发布:维戈 莫特森 知乎 编辑:程序博客网 时间:2024/06/01 17:29
最大子矩阵和
输入
第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)
输出
输出和的最大值。如果所有数都是负数,就输出0。
输入示例
3 3-1 3 -12 -1 3-3 1 2
输出示例
7
分析:
把每一列第i行到第j行之间的和求出来,形成一个数组,于是一个第i行到第j行之间的最大子矩阵和对应于这个和数组的最大子段和。(这样就化为一维的了)
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[510][510];int dp[510];int main(){ int n ,m ; scanf("%d %d",&m,&n);//注意输入顺序,坑。。。 int flag = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { scanf("%d",&a[i][j]); if(a[i][j] > 0) //判断是否全部为负值 flag = 1; } int sum, ans = 0; for(int i = 1; i <= n; i++) // 每一行、每一列顺序相加 for(int j = i; j <= n ; j++) { sum = 0; //转换为一维求最大子段和,每一次都要初始化 for(int k = 1 ; k <= m; k++) { if(i == j) { dp[k] = a[i][k]; } else { dp[k] = dp[k] + a[j][k]; } sum += dp[k]; ans = max(ans , sum); if(sum < 0 ) sum = 0; }} if(flag) printf("%d\n",ans); else printf("0\n");return 0; }
阅读全文
1 0
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大矩阵子和
- 最大子矩阵和
- 最大子矩阵和
- 最大和子矩阵
- 最大和子矩阵
- 最大子矩阵和
- 最大和子矩阵
- 最大子矩阵和
- 最大子矩阵和
- js前端实现模糊查询
- JavaScriptCore的坑? 可能,待研究(JSExportAs方式绑定的本地通信)
- Linux设备模型(7)_Class
- 日常学习之 std::pair
- WARN No appenders could be found for logger的解决方法
- 最大子矩阵和
- java数据格式转换
- PAT基础题 4-11 求自定类型元素序列的中位数
- Unicode字符集下CString/tchar*与char *转换 (解决中文乱码等)
- 51nod 动态数组基础教程 5
- 在ubuntu系统中配置Qt和opencv
- MyBatis学习系列之一
- java集合(一)总图
- async & await 的前世今生