zoukankan      html  css  js  c++  java
  • 洛谷P1719 最大加权矩形

    题目描述

    为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没有马上答应他们,而是先给她们出了一道数学题,并且告诉她们:你们能获得的运动场地的面积就是你们能找到的这个最大的数字。

    校长先给他们一个N*N矩阵。要求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于[-127,127],例如

    0 –2 –7 0 在左下角: 9 2

    9 2 –6 2 -4 1

    -4 1 –4 1 -1 8

    -1 8 0 –2 和为15

    几个女孩子有点犯难了,于是就找到了电脑组精打细算的HZH,TZY小朋友帮忙计算,但是遗憾的是他们的答案都不一样,涉及土地的事情我们可不能含糊,你能帮忙计算出校长所给的矩形中加权和最大的矩形吗?

    输入输出格式

    输入格式:
    第一行:n,接下来是n行n列的矩阵。

    输出格式:
    最大矩形(子矩阵)的和。

    输入输出样例

    输入样例#1:
    4
    0 –2 –7 0
    9 2 –6 2
    -4 1 –4 1
    –1 8 0 –2
    输出样例#1:
    15
    说明

    n<=120

    看到这道题,我瞬间想起了NOI OpenJudge 题库上的P1768最大子矩阵问题,此两题除了名字不同,确实一模一样。

    关键词:贪心、二维转一维、最大字段和

    total数组用于存纵向数值之和,total[i][j]代表从第0行到第i行第j-1纵列数值之和,

    要求第q行到第z行纵列数值之和,用total[z][j]-total[q-1][j]即可。(前缀和优化)——此处即开始分各种情况(q、z不同)

    total1用于在求出对应纵列数值之和后(一种情况),将其转化为最大子段和问题(只要一维!),

    最大子段和问题公式为total1[j]=max(total1[j-1]+total1[j],total1[j]),这一行中得到的最大值那一列及其前面的数即为第q到z行最大子段。

    最终将各个情况(不同行)的最大子段数比个大小即可。

    #include<cmath>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[101][101],b[101],total[101][101]={},total1[101]={};
    int main()
    {
      int i,j,k,n,m=-1,mx=-1000,q,z;
      cin>>n;
      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
          cin>>a[i][j];
      for(i=0;i<n;i++)
        total[0][i]=a[0][i];
        for(i=1;i<n;i++)
          for(j=0;j<n;j++)
        {
          total[i][j]=total[i-1][j]+a[i][j];
        }
      for(q=1;q<n;q++)
        for(z=q;z<n;z++)
        {
          for(j=0;j<n;j++)
          {
            total1[j]=total[z][j]-total[q-1][j];
          }
          for(j=1;j<n;j++)
              total1[j]=max(total1[j-1]+total1[j],total1[j]);
              for(j=0;j<n;j++)
                if(total1[j]>m) {m=total1[j];mx=j;}
       }
      cout<<m<<endl;
      return 0;
    }
  • 相关阅读:
    [ERR] Node 10.211.55.8:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    PAT A1137 Final Grading (25 分)——排序
    PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
    PAT A1134 Vertex Cover (25 分)——图遍历
    PAT A1133 Splitting A Linked List (25 分)——链表
    PAT A1132 Cut Integer (20 分)——数学题
    PAT A1130 Infix Expression (25 分)——中序遍历
    PAT A1142 Maximal Clique (25 分)——图
    PAT A1141 PAT Ranking of Institutions (25 分)——排序,结构体初始化
    PAT A1140 Look-and-say Sequence (20 分)——数学题
  • 原文地址:https://www.cnblogs.com/yanshannan/p/7327912.html
Copyright © 2011-2022 走看看