NYOJ 104 - 最大和

来源:互联网 发布:重庆淘宝店铺运营公司 编辑:程序博客网 时间:2024/05/16 06:49

描述
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:

9 2
-4 1
-1 8
其元素总和为15。

输入

第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数;


 输出

输出矩阵的最大子矩阵的元素之和。

 

样例输入

1
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2


 样例输出

15

 

简单DP,无需多言。

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int mat[105][105];int tmp[105][105];int main(){    int T;    scanf("%d", &T);    while (T--)    {        int n, m;        scanf("%d %d", &n, &m);        for (int i = 1; i <= n; ++i)            for (int j = 1; j <= m; ++j)                scanf("%d", &mat[i][j]);        memset(tmp, 0, sizeof(tmp));        int sum, maxn;        maxn = -100000;        for (int i = 1; i <= n; ++i)            for (int j = 1; j <= m; ++j)                tmp[i][j] = tmp[i-1][j] + mat[i][j];        for (int i = 1; i <= n; ++i)        {            for (int j = i; j <= n; ++j)            {                sum = 0;                for (int k = 1; k <= m; ++k)                {                    if (sum > 0)                        sum += (tmp[j][k] - tmp[i-1][k]);                    else                        sum = tmp[j][k] - tmp[i-1][k];                    maxn = max(maxn, sum);                }            }        }        printf("%d\n", maxn);    }    return 0;}


 

0 0
原创粉丝点击