二维子数组之和的最大值

来源:互联网 发布:手机淘宝分享在哪 编辑:程序博客网 时间:2024/06/04 18:49
#include<iostream>
#define N 2
#define M 3
using namespace std;

//方法一:时间复杂度为:N^2 * M^2 * Max_Matrix的时间复杂度 = N^3 * M^3

int A[N][M] ={{-1,2,-2},{1,2,1}};
int B[N+1][M+1] ={{0,0,0,0},{0,-1,2,-2},{0,1,2,1}};
int Max(int x,int y)
{
return x>y? x:y;
}


int Max_Matrix(int min_x,int max_x,int min_y,int max_y)
{
int sum=0;
for(int i=min_x;i<=max_x;i++)
for(int j=min_y;j<=max_y;j++)
sum += A[i][j];
return sum;
}

//方法二:用PS保存子矩阵的值,不过数组从(1,1)开始保存值


int main()
{
int max = A[0][0];
for(int min_x=0;min_x<N;min_x++)
for(int max_x=min_x;max_x<N;max_x++)
for(int min_y=0;min_y<M;min_y++)
for(int max_y=min_y;max_y<M;max_y++)
max = Max(max,Max_Matrix(min_x,max_x,min_y,max_y));
cout<<max<<endl;

int PS[N+1][M+1];
for(int i = 0;i<=N;i++)
PS[i][0] = 0;
for(int j = 0;j<=M;j++)
PS[0][j] = 0;

for(int i = 1;i<=N;i++)
for(int j= 1;j<=M;j++)
{
PS[i][j] = PS[i-1][j] + PS[i][j-1] - PS[i-1][j-1] + B[i][j];
cout<<PS[i][j]<<" ";
}

//方法二:时间复杂度 N^2 * M^2
cout<<endl;
max = B[1][1];
int min_x,min_y,max_x,max_y;
for(min_x=1;min_x<=N;min_x++)
for(max_x=min_x;max_x<=N;max_x++)
for(min_y=1;min_y<=M;min_y++)
for(max_y=min_y;max_y<=M;max_y++)
{
int sum = PS[max_x][max_y] - PS[max_x][min_y-1] - PS[min_x-1][max_y] + PS[min_x-1][min_y-1];
if(sum > max)
max = sum;
}

cout<<max<<endl;


return 0;
}
0 0
原创粉丝点击