hdoj 1559 最大子矩阵 【矩阵压缩 DP】

来源:互联网 发布:53分钟68分钟知乎截图 编辑:程序博客网 时间:2024/06/05 17:58

最大子矩阵

Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3333    Accepted Submission(s): 1689


Problem Description
给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。

Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。

Output
对于每组数据,输出一个整数,表示子矩阵的最大和。

Sample Input
14 5 2 23 361 649 676 588992 762 156 993 169662 34 638 89 543525 165 254 809 280

Sample Output
2474
矩阵压缩:和hdoj1081 一样的
 
#include<stdio.h>#include<string.h>#define INF 0x3f3f3f#define MAX 1000+10int map[MAX][MAX];int dp[MAX][MAX];int max(int x,int y){    return x>y?x:y;}int main(){    int t,n,m,x,y,k,l;    int i,j,sum,maxsum,s;    scanf("%d",&t);    while(t--)    {        scanf("%d%d%d%d",&n,&m,&x,&y);        memset(dp,0,sizeof(dp));        for(i=1;i<=n;i++)        {            for(j=1;j<=m;j++)            {                scanf("%d",&map[i][j]);                if(i==1)                dp[i][j]=map[i][j];                else                dp[i][j]=map[i][j]+dp[i-1][j];            }        }        maxsum=-INF;        for(i=1;i<=n;i++)        {            for(j=i;j<=n;j++)            {                if(j-i+1!=x)//不满足要求                 continue;                for(k=1;k<=m;k++)                {                    sum=dp[j][k]-dp[i-1][k];                    s=0;                    for(l=k;l<k+y&&l<=m;l++)//加限制                     {                        s+=dp[j][l]-dp[i-1][l];                        if(s>sum)                        sum=s;                        if(s<0)                        s=0;                    }                    maxsum=max(sum,maxsum);                }            }        }        printf("%d\n",maxsum);    }    return 0;} 


0 0
原创粉丝点击