经典面试题——二维矩阵子矩阵和问题
来源:互联网 发布:旅游规划行业知乎 编辑:程序博客网 时间:2024/05/17 01:12
两种方法:有空再详细说明
#include <iostream>#include <iomanip>using namespace std;int sumOfArray_1(int** array, int m, int n){ int **a = new int*[m+1]; int **sum = new int*[m+1]; for(int i = 0 ; i <= m; ++i){ sum[i] = new int[n+1]; a[i] = new int[n+1]; memset(sum[i], 0, sizeof(int)*(n+1)); memset(a[i], 0, sizeof(int)*(n+1)); } for(int i = 1 ; i <= m; ++i) for(int j = 1; j <= n; ++j) a[i][j] = *((int*)array+(i-1)*n + j-1); for(int i = 1; i <= m; ++i){ for(int j = 1; j <= n ; ++j){ sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]; cout<<sum[i-1][j]<<'+'<<sum[i][j-1]<<'-'<<sum[i-1][j-1]<<"+"<<a[i][j]<<"->"; cout<<"sum["<<i<<"]["<<j<<"]="<<sum[i][j]<<endl; } } int maxSum = 0; for(int i_min = 1; i_min <= m; ++i_min) for(int i_max =i_min; i_max <= m ; ++i_max) for(int j_min = 1; j_min<= n; ++j_min) for(int j_max = j_min; j_max<= n; ++j_max){ int tmp = sum[i_min-1][j_min-1] + sum[i_max][j_max] - sum[i_min-1][j_max] -sum[i_max][j_min-1]; if(tmp>maxSum){ maxSum = tmp; cout<<"("<<i_min<<", "<<j_min<<")->("<<i_max<<", "<<j_max<<")"<<endl; } } for(int i = 0 ; i < m ; ++i) delete[] sum[i]; return maxSum;}int sumOfArray_2(int** array, int m, int n){ int **a = new int*[m+1]; int **sum = new int*[m+1]; for(int i = 0 ; i <= m; ++i){ sum[i] = new int[n+1]; a[i] = new int[n+1]; memset(sum[i], 0, sizeof(int)*(n+1)); memset(a[i], 0, sizeof(int)*(n+1)); } for(int i = 1 ; i <= m; ++i) for(int j = 1; j <= n; ++j) a[i][j] = *((int*)array+(i-1)*n + j-1); for(int i = 1; i <= m; ++i){ for(int j = 1; j <= n ; ++j){ sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]; cout<<sum[i-1][j]<<'+'<<sum[i][j-1]<<'-'<<sum[i-1][j-1]<<"+"<<a[i][j]<<"->"; cout<<"sum["<<i<<"]["<<j<<"]="<<sum[i][j]<<endl; } } int maxSum = 0; for(int a = 1; a <= m; ++a){ for(int c = a; c <= m; ++c){ int start = sum[c][0]-sum[a-1][0]; int all = start; for(int i = 1; i <= n; ++i){ if(start<0) start = 0; start += sum[c][i]-sum[a-1][i]-sum[c][i-1]+sum[a-1][i-1]; cout<<setw(2)<< start<<' '; if(start>all) all = start; } if(all>maxSum) maxSum = all; cout<<endl; } } for(int i = 0 ; i < m ; ++i) delete[] sum[i]; return maxSum;}int main(){ const int m = 3; const int n = 5; int array[m][n] = {{ 1, 2, 0, 3, 4}, { 2, 3, 4, 5, 1}, { 1, 1, 5, 3, 0}}; cout<<sumOfArray_2((int**)array,m,n)<<endl; system("PAUSE"); return 0;}
- 经典面试题——二维矩阵子矩阵和问题
- 每日微软面试题——day 8(最大的二维子矩阵)
- 每日微软面试题——day 8(最大的二维子矩阵)
- [各种面试题] 最大子矩阵和
- 求二维矩阵最大子矩阵和
- 【每日面试题】求一个矩阵中最大的二维矩阵(元素和最大)
- 29. 微软面试题:求一个矩阵中最大的二维矩阵(元素和最大)
- 经典算法——子矩阵的最大累加和问题
- [经典面试题]蛇形矩阵(螺旋矩阵)
- 面试题20—顺序打印矩阵
- 经典面试题——子数列和
- 二维数组和最大的子矩阵
- 二维数组最大子矩阵和
- 最大二维子矩阵
- 求矩阵中元素和最大的二维子矩阵
- 【动态规划】求二维矩阵的最大和子矩阵
- 经典面试题——从矩阵的左上角到右下角有多少种方法。
- 腾讯面试题(九度)——面积最大的全1子矩阵
- 去年的齐鲁软件大赛,关于语义识别方面,一种简单的实现想法。
- linux输入子系统
- Spring MVC 中文乱码问题
- 黑马程序员_.NET学习16(回看总结AJAX)
- 找工作中遇到的问题1
- 经典面试题——二维矩阵子矩阵和问题
- 异步IO
- Iphone开发之音频101 (part 1): 文件和数据类型
- 为什么会有这么多苦逼的程序员
- HDU 1036
- VC按TAB键控制控件顺序
- HDU1009 贪心水题
- Web.config详解
- 关于SOCKET编程的一些整理!