hdu 1559最大子矩阵

一直很少练dp~这几天再学学~~

在本题中:a[i][j]的值表示左上角为(1,1)右下角为(i,j)的矩阵的所有元素之和~

给你一个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

1
4 5 2 2
3 361 649 676 588
992 762 156 993 169
662 34 638 89 543
525 165 254 809 280

Sample Output

2474
#include <iostream>
#include <string.h>
#include <string>
#include <stdio.h>
#include <cmath>
const int maxn=1010;
using namespace std;
int a[maxn][maxn];
int main()
{
 int t,n,m,x,y;
 cin>>t;
 while(t--)
 {
  scanf("%d%d%d%d",&n,&m,&x,&y);
  memset(a,0,sizeof(a));
  for(int i=1;i<=n;i++) //将行叠加
   for(int j=1;j<=m;j++)
   {
    scanf("%d",&a[i][j]);
    a[i][j]+=a[i][j-1];
   }
  for(int i=1;i<=n;i++) //将列叠加,都叠加完之后,a[i][j]就表示左上角为(1,1)右下角为(i,j)的矩阵;
   for(int j=1;j<=m;j++)
   {
    a[i][j]+=a[i-1][j];
   }
  //下面开始递推;
  int Max=a[x][y];
  for(int i=x;i<=n;i++)
   for(int j=y;j<=m;j++)
   {
     if(i==x&&j==y)continue;
     if(i==x&&j!=y)
     {
      Max=max(Max,a[i][j]-a[i][j-y]);
     }
     else if(i!=x&&j==y)
     {
      Max=max(Max,a[i][j]-a[i-x][j]);
     }
     else if(i!=x&&j!=y)
     {
      Max=max(Max,a[i][j]-a[i][j-y]-a[i-x][j]+a[i-x][j-y]);
     }
   }
   cout<<Max<<endl;
 }
 return 0;
}

hdu 1559最大子矩阵

时间: 2024-12-21 22:34:24

hdu 1559最大子矩阵的相关文章

HDU 1559 最大子矩阵 (DP)

题目地址:HDU 1559 构造二维前缀和矩阵.即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和.然后枚举每个矩阵的左上方的点,由于矩阵的长和宽是固定的,那么这个矩阵实际上也已经固定了.此时这个矩阵的和用公式: sum=a[i+x-1][j+y-1]-a[i+x-1][j-1]-a[i-1][j+y-1]+a[i-1][j-1]; 取最大值就可以了. 代码如下: #include <iostream> #include <cstdio> #in

hdu 1559(最大子矩阵)

最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3906    Accepted Submission(s): 1994 Problem Description 给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大. Input 输 入数据的第一行为一个正整数T,表示有T组测试数据.每一组测试数

HDU 1559 最大子矩阵--dp--(最大和子矩阵模型)

题意:给定一个矩阵,求一个宽为a,长为b的子矩阵的最大和 分析:直接用最大和子矩阵的公式,只是这里多了一个限制条件,所以在求和的时候稍有点不同,就是不逐行和逐列求了而是每次以a,b为跨度来求 dp[k]=mt[i][k]+....+mt[i+a][k],然后每次求sum=dp[k]+.....+dp[k+b],mx=max(mx,sum) 代码: #include<iostream> #include<cstring> using namespace std; int m,n,a,

hdu 1081最大子矩阵的和DP

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8210    Accepted Submission(s): 3991 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectan

hdu 1505(最大子矩阵)

City Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6140    Accepted Submission(s): 2618 Problem Description Bob is a strategy game programming specialist. In his new city building game th

hdu 1081(最大子矩阵)

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10920    Accepted Submission(s): 5229 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectan

hdu 1506 最大子矩阵面积

//写动态规划的题目 要把主要问题提炼出来 这里的问题就是求area=(j-k+1)*a[i]  如果找到j k是解决这个题目的关键 这里暴力求肯定是要超时的 这里用dp来优化 #include<stdio.h> #include<string.h> __int64 a[100005],dp[100005],l[100005],r[100005]; int main() { __int64 n,i,t,max; while(scanf("%I64d",&

HDU 1081 最大子矩阵和

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11715    Accepted Submission(s): 5661 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectan

前缀和——HDU - 1559

题目链接 用一个sum[i][j]表示前i行前j列所有元素之和 当i>=x&&j>=y时,我们可以在前i行前j列找到满足大小的矩阵 由于我们i和j是从小到大找,所以每次找以a[i][j]作为右下角的目标矩阵来作比较 这样就能不重不漏了 题目代码 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef long long LL; c