51nod 1051 最大子矩阵和 dp

来源:互联网 发布:上海大学乐乎论坛 编辑:程序博客网 时间:2024/04/30 03:09

题意:

一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。

例如:3*3的矩阵:

-1 3 -1
2 -1 3
-3 1 2

和最大的子矩阵是:

3 -1
-1 3
1 2

分析:

三重循环,类似于求解一维中的最大连续和一样的dp问题,只不过换成了二维而已。


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>using namespace std;const int maxn = 505;int n, m;long long p[maxn][maxn];//p[i][j] = a[i][1]+a[i][2]+.....+a[i][j]int main(){while(scanf("%d %d", &m, &n)==2)    {        memset(p, 0, sizeof(p));        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= m; j++)            {                int t;                scanf("%d", &t);                p[i][j] = p[i-1][j] + t;            }        }//        for(int i = 1 ; i <= n ; i++)//        {//            for(int j = 1 ; j <= m ; j++)//            {//                cout<<p[i][j]<<" ";//            }//            cout<<endl;//        }        int maxn = 0;        for(int i = 1; i <= n; i++)        {            for(int j = i; j <= n; j++)            {                int sum = 0;                for(int k = 1; k <= m; k++)                {                    sum += (p[j][k] - p[i-1][k]);                    if(sum < 0)                    sum = 0;                    if(sum > maxn)                    maxn = sum;                }            }        }        printf("%d\n", maxn);    }    return 0;}


0 0