`
richard_ma
  • 浏览: 16573 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

POJ1050 最大子矩阵

阅读更多

To the Max

http://poj.org/problem?id=1050

Description

Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.
As an example, the maximal sub-rectangle of the array:

 0 -2 -7  0
 9  2 -6  2
-4  1 -4  1
-1  8  0 -2
is in the lower left corner:

 9 2
-4 1
-1 8
and has a sum of 15.

Input
The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].
Output

Output
the sum of the maximal sub-rectangle.

Sample Input
4
0 -2 -7 0 9 2 -6 2
-4 1 -4  1 -1

8  0 -2

Sample Output
15

解题思路
本题是典型的动态规划,实际是求矩阵的最大子矩阵(和最大)。这是将序列的连续最大段和问题扩展到二维的一题。

序列的最大连续段和问题思路:
原序列a    0 -2 -7 0 9 2 -6 2
记录    b    0  0  0 0 9 11 5 7
结果为11

将这个问题扩展到二维,则先将选中的几行,逐列相加变为一个一维数组。(如果是一行的情况,则直接使用序列的最大连续段和方法)

多行变为一行时:例如
 0 -2 -7  0
 9  2 -6  2
-4  1 -4  1
-1  8  0 -2

当i=0, j=2时,则选择0,1,2行
    0 -2 -7   0
    9  2 -6   2
   -4  1 -4   1
a: 5  1 -17 3
b: 5  6  0   3
答案为3

参考
http://blog.csdn.net/jqandjq/article/details/5060283

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char const* argv[])
{
    int i, j, k, l, n, ans, sum, max;
    int a[100][100];
    int b[100];

    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    ans = 0;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if (i == j) {
                for (k = 0; k < n; k++) {
                    b[k] = a[i][k];
                }
            } else {
                for (k = 0; k < n; k++) {
                    b[k] = 0;
                    for (l = i; l <= j; l++) {
                        b[k] += a[l][k];
                    }
                }
            }

            sum = 0;
            max = 0;
            for (k = 0; k < n; k++) {
                sum += b[k];
                if (sum > max) {
                    max = sum;
                }
                if (sum < 0) {
                    sum = 0;
                }
            }

            if (max > ans) {
                ans = max;
            }
        }
    }

    printf("%d\n", ans);

    return 0;
}

 

分享到:
评论

相关推荐

    poj 1050

    poj online judge 1050 最大子矩阵动态规划解决

    华中科技大学_2022年春_算法实践报告

    如果存在一个包含最大子矩阵P的更大子矩阵B,那么B中一定包含了另一个最大子矩阵P',这与P已经是最大子矩阵相矛盾,因此可以断定P就是所有包含它的子矩阵中元素和最大的。此外,该问题还具备子问题无关性和子问题...

    二维树状数组学习之二:练习POJ 1195

    POJ 1195题目要求我们计算一个二维矩阵中的子矩阵之和。这正是二维树状数组的优势所在,因为我们可以快速地对矩阵的任意矩形区域进行累加操作。下面我们将详细讲解二维树状数组的工作原理以及如何使用它来解决这个...

    acm/icpc 课件 贪心 递归 图论 最大矩阵乘积

    例如,对于矩阵乘积的最大化,可以尝试每次选取两个子矩阵,使得它们的乘积最大,然后合并这两个子矩阵,重复此过程,直到所有元素都被选取。 【递归】 递归是解决问题的一种常见方法,它通过调用自身来解决更小...

    算法实验(动态规划-12-16题)1

    这道题目要求我们找到一个给定矩阵中的最大子矩阵和。这道题目可以使用动态规划来解决。我们可以使用 Kadane's algorithm 来解决这个问题,该算法可以在 O(n^3) 的时间复杂度内解决问题。 第 13 题:poj1088 滑雪 ...

    树状数组题解1

    对于矩阵中的每个元素,可以通过二维树状数组在常数时间内完成子矩阵的求和操作,从而高效地处理矩阵的各种操作。 3. POJ2299【基础】: 这道题目要求求解序列中进行多少次交换操作才能将其升序排列。逆序对的数量...

Global site tag (gtag.js) - Google Analytics