poj 1050 最大子矩阵和
2016-03-18 18:31
274 查看
一、思路
最大子矩阵和的方法和最大字段和一样先单独对每行求最大字段和(此时,子矩阵的行为1,就是最大字段和了)
然后,把第i行后的各行对应列的元素加到第i行的对应列元素,每加一行,就求一次最大字段和,这样就把子矩阵的多行压缩为一行了,一行了就是最大字段和了
也可以这样理解:
a11 a12 a13
a21 a22 a23
a31 a32 a33
如图,先求第一行最大子段和,再求第一行跟第二行合起来的最大子段和,如a21+a11, a22+a12, a23+a13 的最大子段和,再求第一到第三合起来的最大子段和,如a11+a21+a31, a12+a22+a32, a13+a23+a33的最大子段和…..以此类推,直到求出整个矩阵的合起来的最大子段和,求出他们之中最大的那个和就是解.
二、AC code
#include <stdio.h> #include <stdlib.h> int m[101][101]; int main() { int n,max,i,j,k,tmp; while(scanf("%d",&n) != EOF) { max=-10000; /* 输入时,顺便求出各行的最大字段和的最大值 */ for(i=0;i<n;++i) { tmp=0; for(j=0;j<n;++j) { scanf("%d",&m[i][j]); if(tmp>0)tmp+=m[i][j]; else tmp=m[i][j]; if(tmp>max)max=tmp; } } for(i=0;i<n-1;++i) { for(j=i+1;j<n;++j) { tmp=0; for(k=0;k<n;++k) { //相当于把子矩阵多行压缩为一行了 m[i][k]+=m[j][k]; if(tmp>0)tmp+=m[i][k]; else tmp=m[i][k]; if(tmp>max)max=tmp; } } } printf("%d\n",max); } return 0; }
相关文章推荐
- 《黑客与画家》读后感
- 【强连通分量】奶牛偶像 usaco 2003
- CI框架获取数据库错误码
- MySQL的my.cnf配置解析
- 应用安全的重要性!再怎么强调都不过分的5大理由
- 电池栏 - 隐藏 & 显示(状态栏)
- JS遍历后台List数据
- Android 官方分辨率详解
- Java第二次实验
- 数组变树练习题
- LeetCode 198. House Robber
- Python 在windows上安装BeautifulSoup
- 贪心算法—Problem Q
- setsockopt中参数之SO_REUSEADDR的意义
- Linux常用命令(自用)
- 关于 self 和 super 在oc 中 的疑惑 与 分析
- List、Map、Set的区别
- Android之EventBus使用详解
- 22. Generate Parentheses
- 删除字符串中的字符的两种情况