Exercise(5):最大子矩阵
来源:互联网 发布:那种牌子的网络电视好 编辑:程序博客网 时间:2024/05/29 15:00
/* 最大和 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵, 使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15。 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据; 每组测试数据: 第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列; 随后有r行,每行有c个整数; 输出 输出矩阵的最大子矩阵的元素之和。 样例输入 1 4 4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 样例输出 15 问题分析: 若用暴力破解,仅仅是遍历所有子矩阵所需时间复杂度都达到了O(n^4),再加上计算子矩阵和的时间复杂度O(n^2), 总计时间复杂度达到O(n^6) 显然不现实。因此可将问题转换为求解 最大子段和 问题。 动规: 1、求矩阵从第i行到第j行各列的和(把二维子矩阵压缩成一个一位数组) 2、对压缩后的一维数组进行 最大字段和求解, 3、最后得出整个程序的解 */#include <iostream>using namespace std;int SubMaxSum(int Temp[],int n) // 求最大子序列和 { int i,b,Sum; b=0; Sum = Temp[0]; for(i=0;i<n;i++) // 列相加 { if(b>0) b += Temp[i]; else b = Temp[i]; if(b>Sum) { Sum = b; } } return Sum;}int main(){ int n; cin>>n; if(n<=0 || n>100) return 0; int r,c,i,j,k,SubMax,ExMax; // r为行 c为列 i,j,k为循环变量 SubMax为行相加后的最大值 ExMax为最终的最大值 int Temp[100],Array[100][100]; // Temp数组存储行相加的数值 Array数组存储整个矩阵 while(n) { ExMax = -9999999999; cin>>r>>c; if(r<=0 || r>100) return 0; if(c<=0 || c>100) return 0; for(i=0;i<r;i++) // 输入矩阵 for(j=0;j<c;j++) cin>>Array[i][j]; for(i=0;i<r;i++) { for(k=0;k<c;k++) // 初始化 Temp[k] = 0; for(j=i;j<r;j++) // 把第i行到第j行相加,对每一次相加求最大值 { for(k=0;k<c;k++) { Temp[k] += Array[j][k]; // 行相加 } SubMax = SubMaxSum(Temp,k); // k即为c列数 if(SubMax > ExMax) { ExMax = SubMax; } } } cout<<ExMax<<endl; // 输出 n--; }}
0 0
- Exercise(5):最大子矩阵
- Exercise(2):最大连续子序列和
- 最大子矩阵问题
- 最大子矩阵模板
- 最大子矩阵问题
- 最大子矩阵问题
- 最大01 子矩阵
- 最大子矩阵问题
- 最大子矩阵
- 最大子矩阵问题
- 最大子矩阵和
- 最大子矩阵问题
- 最大子矩阵问题:
- 最大子矩阵和
- 最大子矩阵之和
- 最大子矩阵问题
- 最大子矩阵和
- 最大二维子矩阵
- 216. Combination Sum III
- Linux字符设备注册与注销
- SAR成像基础知识急救箱(零)关于傅里叶变换的几个小困惑
- [剑指offer]跳台阶&变态跳台
- java jsp实现网站访问量的统计
- Exercise(5):最大子矩阵
- 写出ELGamal公钥密码算法的加密、解密过程
- HDU 5671 Matrix
- Java 连接SQLServer 2012
- shape标签总结
- 1009
- SpringMVC
- 泰勒级数
- Android:Click,LongClick,Touch,KeyDown,KeyUp事件使用心得