最大子矩阵问题
2011-04-24 15:26
183 查看
问题描述:
/article/5674749.html
以下是来微软100题:
求一个矩阵中最大的二维矩阵(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用C 写出关键代码
此第35 题与第3 题相类似,一个是求最大子数组和,一个是求最大子矩阵和。
3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
以下是代码:
/article/5674749.html
以下是来微软100题:
求一个矩阵中最大的二维矩阵(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用C 写出关键代码
此第35 题与第3 题相类似,一个是求最大子数组和,一个是求最大子矩阵和。
3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
以下是代码:
#include <iostream> using namespace std; /* *函数功能:求矩阵arr中最大的二维子矩阵(元素的和最大) *算法思想:2*2的窗口对整个矩阵进行扫描 *时间复杂度为:O(m*n),m,n分别为二维矩阵的行数和列数 */ int GetMax2DSubMartix(int (*arr)[5], int row, int col, int &pos_x, int &pos_y) { int max = 0; int res = 0; for (int i = 0; i < row - 1; i++) { for (int j = 0; j < col - 1; j++) { res = arr[i][j] + arr[i+1][j] + arr[i][j+1] + arr[i+1][j+1]; if(res > max) { max = res; pos_x = i; pos_y = j; } } } return max; } /* ×函数功能:求序列arr中和为最大的子序列,begin,end分别存在子序列的开始和结束的位置 *算法思想:动态规划的典型例子,复杂度为O(N) */ int GetMaxSubSequence(int arr[], int n, int &begin, int &end) { int max = 0;//保存最大和 int sum = 0;//记录当前和 begin = 0; for (int i = 0; i < n; i++) { sum += arr[i]; if (sum < 0) { sum = 0; begin = i + 1; } else { if(sum > max) { max = sum; end = i; } } } return max; } /* ×函数功能:求矩阵arr中最大的子矩阵(元素的和最大) *算法思想:http://www.cppblog.com/superKiki/archive/2010/05/27/116465.html ×也就是转换为求一维数组的最大子序列 ×参数left_row和left_col表示子矩阵左上角的位置,right_row和right_col为右下角 */ int GetMaxSubMartix(int **arr, int row, int col, int &left_row, int &left_col, int &right_row, int &right_col) { int max = -999999999; int sub = 0; int a, b; for (int i = 0; i < row; i++) { int *temp = new int[col](); //存放0-col列的和 for (int j = i; j < row; j++) { for (int k = 0; k < col; k++) temp[k] = temp[k] + *((int*)arr + j*col + k); //求和 sub = GetMaxSubSequence(temp, col, a, b); //求该序列的最大值,返回的a,b分表表示字矩阵列的 if (sub > max) { max = sub; left_row = i; //字矩阵的行 right_row = j; left_col = a; //字矩阵的列 right_col = b; } } } return max; } int main() { int arr[3][5] = { {1, 2, 0, 3, 4}, {2, 3, 4, 5, 1}, {1, 1, 5, 3, 0}}; int x, y; int max = GetMax2DSubMartix(arr, 3, 4, x, y); printf("最大值为:%d,元素为:/n%d %d/n%d %d/n", max, arr[x][y], arr[x][y+1], arr[x+1][y], arr[x+1][y+1]); int arr1[4][4] = { {0,-2, -7, 0}, {9, 2, -6, 2}, {-4, 1, -4, 1}, {-1, 8, 0, -2} }; int x1 , y1, x2, y2; x1 = y1 = x2 = y2 = 0; max = GetMaxSubMartix((int**)arr1, 4, 4, x1, y1, x2, y2); printf("The max sum is: %d/n", max); for (int i = x1; i<= x2; i++) //显示子矩阵 { for (int j = y1; j <= y2; j++) { printf("%3d ", arr1[i][j]); } printf("/n"); } system("pause"); }
相关文章推荐
- 校招季——编程题目(15、16) 约瑟夫问题 最大子矩阵和
- 动态规划3:最大子段和问题到最大子矩阵问题(三):初探最大子矩阵之和问题
- 最简洁易懂的最大子矩阵问题(极大化思想)
- 动态规划解决最大子矩阵问题
- 经典算法——子矩阵的最大累加和问题
- HDU ACM 1081 最大子矩阵问题
- CF22B 最大子矩阵问题简单版
- 最大字段和的扩展---最大子矩阵和及最大m字段和问题
- 最大子矩阵问题(动态规划的推广)
- poj 1964 最大子矩阵问题
- 经典动态规划——HDU1081 To The Max 最大子矩阵问题
- POJ1050与最大连续子段和,最大子矩阵问题
- 最大子矩阵问题(POJ1050)
- 最大子矩阵问题<DP>
- 子矩阵的最大累加和问题
- Dp_关于最大子矩阵的问题总结
- dp解决最大子矩阵问题
- ACM——最大子矩阵问题——单位矩阵
- HDU 1081(最大子矩阵问题)
- 最大子矩阵问题-hdu-1559