编程之美 - 二维数组最大和的子序列

问题描述:

找出二维数组中的最大和的子序列。二维数组中的子序列是二维数组中的一个方块。

思路一:

使用暴力的方式,从每一个元素开始,变量以它为左上定点的所有的可构造的方块。

时间复杂度 N*N*M*M* sum(MN)

函数:getMaxSum1()

思路二:

参考一维数组的方式,将二维数组的转化为一个一维数组后,再进行求和。

例如:在二维数组中选择了 a 到 c 行,把a~c行中的列元素进行求和,就可以得到一个一维数组。从0到N不断改变a~c的范围就可以变量整个数组。

复杂度为 N*N*M

《编程之美 - 二维数组最大和的子序列》

函数:getMaxSum2()

#include <iostream>

using namespace std;

#define INF -10000000
int max(int x, int y)
{
    return (x > y) ? x : y;
}


/////////////////////////////////////////////////////////////////////////////////
//
//  Get Sum function 1
//
/////////////////////////////////////////////////////////////////////////////////
int sum_rect(int arr[][6], int row_min, int row_max, int col_min, int col_max)
{
    int sum = 0;
    int i = 0, j = 0;

    for (i = row_min; i <= row_max; i++)
        for (j = col_min; j <= col_max; j++)
            sum += arr[i][j];

    cout << "(" << row_min << ", " << row_max << ", " << col_min << ", " << col_max << ", " << ") = " << sum << endl;

    return sum;
}

int getMaxSum1(int arr[][6], int row, int col)
{
    int ret = 0;
    int row_min, row_max, col_min, col_max;

    for (row_min = 0; row_min < row; row_min++)
        for (row_max = row_min; row_max < row; row_max++)
            for (col_min = 0; col_min < col; col_min++)
                for (col_max = col_min; col_max < col; col_max++)
                    ret = max(ret, sum_rect(arr, row_min, row_max, col_min, col_max));

    return ret;
}

/////////////////////////////////////////////////////////////////////////////////
//
//  Get Sum function 2
//
/////////////////////////////////////////////////////////////////////////////////
int BC(int arr[][6], int a, int c, int col)
{
    int i = 0;
    int sum = 0;

    for (i = a; i <= c; i++)
    {
        sum += arr[i][col];
    }
    cout << "(" << a << ", " << c << ", " << col << ", " << ") = " << sum << endl;

    return sum;
}


int getMaxSum2(int arr[][6], int row, int col)
{
    int a = 0, c = 0;
    int i = 0;
    int start = 0, sum = 0, max_val = INF;

    for (a = 0; a < row; a++)
        for(c = a; c < row; c++)
        {
            start = BC(arr, a, c, col-1);
            sum = start;

            for (i = col-2; i >= 0; i--)
            {
                if (start < 0)
                    start = 0;

                start += BC(arr, a, c, i);
                if (start > sum)
                    sum = start;
            }
            if (sum > max_val)
                max_val = sum;
        }

    return max_val;
}

void main()
{
    int i = 0;
    int test1[4][6] = {{1, -2,  3,  5,  -3, 2},
                       {1, -6, 20, 20,  -2, 1},
                       {5,  0, 20, 20, -10, 4},
                       {5,  0,  1, -8,   2, 4}};

    i = getMaxSum1(test1, 4, 6);

    cout << "max value = "<< i << endl;

    i = getMaxSum2(test1, 4, 6);
    cout << "max value = "<< i << endl;
    cin>> i;
}


    原文作者:zy__
    原文地址: https://blog.csdn.net/wangzhiyu1980/article/details/51495728
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞