动态规划-最大子矩阵和

来源:互联网 发布:布鲁克大学 知乎 编辑:程序博客网 时间:2024/06/04 14:05
求输入一个矩阵的最大子矩阵和
输入

第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)

输出

输出和的最大值。如果所有数都是负数,就输出0。

输入示例

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

输出示例

7

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;long  map[505][505];long  dir[505][505];int main(){    int n,m;    int i,j,k;    while (~scanf("%ld%ld",&m,&n))    {           memset(map,0,sizeof (map));           memset(dir,0,sizeof (dir));        for (i=1; i<=n; i++)            for (j=1; j<=m; j++)            {                scanf ("%d",&map[i][j]);                if (map[i][j]<0)k++;                if (i!=1)                    dir[i][j]=map[i][j]+dir[i-1][j];                else                  dir[i][j]=map[i][j];              }              if (k==n*m){printf("0\n"); continue;}              long  Max=0,sum=0;printf("r %d  r",dir[4][3]);         for (i=0; i<=n; i++)//起始行         {                for (j=i+1; j<=n; j++)//结束行                {                      // printf("%d ",dir[i][j]);                       sum=0;                       for (k=1; k<=m; k++)                       {                              int t=dir[j][k]-dir[i][k];                              sum+=t;                              if (sum>Max) Max=sum;                              if (sum<0) sum=0;                       }                }         }         printf("%ld\n",Max);    }    return 0;}


友情链接:具体讲解




0 0
原创粉丝点击