zoukankan      html  css  js  c++  java
  • 最大子矩阵

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

    题解: dp[i][j] 代表以 i 行 j 列的元素作为右下角的矩阵的和

    dp完后,容斥找到答案

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 using namespace std;
     5 #define MAXN 1005
     6 int n,m,x,y;
     7 int data[MAXN][MAXN];
     8 int dp[MAXN][MAXN];
     9 
    10 int main()
    11 {
    12     int T;
    13     cin>>T;
    14     while (T--)
    15     {
    16         scanf("%d%d",&n,&m);
    17         scanf("%d%d",&x,&y);
    18         for (int i=0;i<n;i++)
    19            for (int j=0;j<m;j++)
    20                 scanf("%d",&data[i][j]);
    21         for (int i=0;i<n;i++)
    22         {
    23             for (int j=0;j<m;j++)
    24             {
    25                 dp[i][j]=data[i][j];
    26                 if (j-1>=0)
    27                     dp[i][j]+=dp[i][j-1];
    28                 if (i-1>=0)
    29                     dp[i][j]+=dp[i-1][j];
    30                 if (i-1>=0&&j-1>=0)
    31                     dp[i][j]-=dp[i-1][j-1];
    32             }
    33         }
    34 
    35         int ans = 0;
    36         for (int i=x-1;i<n;i++)
    37         {
    38             for (int j=y-1;j<m;j++)
    39             {
    40                 int res = dp[i][j];
    41                 if (i-x>=0)
    42                     res -= dp[i-x][j];
    43                 if (j-y>=0)
    44                     res -= dp[i][j-y];
    45                 if (i-x>=0&&j-y>=0)
    46                     res += dp[i-x][j-y];
    47                 if (res>ans)
    48                     ans = res;
    49             }
    50         }
    51         printf("%d
    ",ans);
    52     }
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    Redis(window版本)安装及使用
    springMVC转发与重定向
    java集合的实现细节--ArrayList和LinkedList
    VMware(虚拟机) 12版安装深度linux系统
    java中String创建对象分析(转)
    java面试之谈
    java中堆与栈的区别
    sql百万级查询优化(转)
    解决Maven下载依赖慢的问题(转)
    SpringMVC的底层实现
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/6748433.html
Copyright © 2011-2022 走看看