zoukankan      html  css  js  c++  java
  • 最大二维子区间和 (贪心+前缀和)

    【题目描述】

        已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。

    【题目链接】

        http://noi.openjudge.cn/ch0406/1768/

    【算法】

        众所周知一维子区间最大值要如何求,那么为求二维子区间最大和可以枚举任意两行,这两行间的同一列的数之和可以看成是一维子区间的一个值,问题就转换成一维子区间的最大值。当然两行间同一列数的和可以由列前缀和之差构成,所以读入的时候构造的初始矩阵就为列前缀和矩阵。

    【代码】

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,i,j,k,ans;
     4 int a[200][200],b[200];
     5 int main()
     6 {
     7     cin>>n;
     8     for(i=1;i<=n;i++)
     9         for(j=1;j<=n;j++)
    10             cin>>a[i][j],a[i][j]+=a[i-1][j];
    11     for(i=0;i<=n;i++)
    12     for(j=i+1;j<=n;j++) {
    13         int rec=0;
    14         for(k=1;k<=n;k++) {
    15             rec+=a[j][k]-a[i][k];
    16             if(rec<0) rec=0;
    17             else ans=max(ans,rec);
    18         }
    19     }
    20     cout<<ans;
    21     return 0;
    22 }
  • 相关阅读:
    Kafka概述与部署
    理解微前端技术原理
    Docker之单机网络一
    MySQL Binlog解析
    MySQL之Xtrabackup
    MySQL之mysqldump
    学生成绩管理系统
    凯域课程表使用体验(软件名:上课了)
    动手动脑问题分析
    关于十天集训的收获
  • 原文地址:https://www.cnblogs.com/Willendless/p/9350560.html
Copyright © 2011-2022 走看看