您的位置:首页 > 其它

最大子矩阵问题

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,

以下是代码:

#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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: