突然感觉刷完这一套专题后 码力有了质的飞跃,fighting 努力会有结果!

最大字段和是一个很经典的问题 O(n)算法

而对于最大子矩阵和

可以思考一个这样的想法

枚举上下边界i,j把i到j这一段的矩阵上下挤压成一个序列

对于i到j的最大子矩阵和问题=求这个序列的最大字段和

所以 复杂度为O(n^3)

而对于最大子长方体和 

依旧 先枚举上下边界 使问题变成最大子矩阵和

复杂度 O(n^5)

这种降维解题的思维方式 十分不错

具体看下面这个题

废料堆(Garbage Heap, UVa 10755)

有个长方体形状的废料堆,由A×B×C个废料块组成,每个废料块都有一个价值,可正可负。现在要在这个长方体上选择一个子长方体,使组成这个子长方体的废料块的价值之和最大。

【输入格式】

输入的第一行为数据组数TT≤15)。每组数据的第一行为3个整数A, B,C(1≤A,B, C≤20)。接下来有A×B×C个整数,即各个废料块的价值,每个废料块的价值的绝对值不超过231。如果给每个废料块赋予一个空间坐标(一个角为(1,1,1),对角线的另一端为(A,B,C)),则这些废料块在输入文件中的出现顺序为:(1,1,1),(1,1,2), …, (1,1,C), (1,2,1), …,(1,2,C), …, (1,B,C), …, (2,1,1), …, (2,B,C), …, (A,B,C)。

【输出格式】

对于每组数据,输出最大子长方体的价值和。

贴下刘汝佳老师的解释

还是老规矩,先想一个正确但低效的方法。枚举x,y,z的上下界x1, x2, y1, y2, z1, z2,然后比较这O(n6)个长方体的价值和,而每个长方体还需要O(n3)时间累加出价值和,所以总时间复杂度为O(n9),即使对于n≤20这样的规模,也太大了。
解决高维问题的常见思路是降维。让我们先来看看本题的二维情况:给定一个数字矩阵,求一个和最大的连续子矩阵。借用上题的思路,我们枚举上下边界y1和y2(规定x从左到右递增,y从上到下递增),则问题转化为了一维问题,如图1-32所示。? ?   ?   ?   ?
?   ?   ?   ?   ?
-1  -2  8   3   1
-5  1   2   -7  -14 -2  10  -3  11
1   3   2   -4  5
9   -4  -2  5   6
?   ?   ?   ?   ?
图  1-32
注意,右图这个一维问题中的一个元素对应左图4个灰色格子的数之和。比如,(-1)+(-5)+1+9=4,(-2)+1+3+(-4)=-2等。
为了节省时间,这4个元素不能再用一重循环来累加得到,否则时间复杂度会变成O(n4)。我们得想办法让这些元素可以在O(1)时间内得到,这样,二维问题才能在O(n3)时间内解决。
解决方法仍然是前面曾多次使用的递推法:设sum(x,y1,y2)表示满足y1≤y≤y2的所有格子(x,y)里的数之和,则当y1<y2时,sum(x,y1,y2)=sum(x,y1,y2-1)+A[x][y2]。这样,可以事先在O(n3)时间内算出整个sum数组,则所有一维问题中的元素都可以在O(1)时间内得到,完整的二维问题在O(n3)时间内得到了解决。
上述两种方法都可以很方便地推广到三维情形,时间复杂度为O(n5)。因为三维情况下的n很小,因此前面所说的空间问题并不严重。下面是算法一的完整代码,它用三维数组S保存以(x,y,z)为“右下角”的长方体的元素和。代码效率不算高,但读者很容易把它推广到四维或更高维的情形。

简单易懂 就不多说了

贴代码:

  #include <cstdio>  #include <cstdlib>  #include <cmath>  #include <cstring>  #include <ctime>  #include <algorithm>  #include <iostream>#include <sstream>#include <string>#define oo 0x13131313const int maxn=22;   using namespace std;int A,B,C;long long STEP1[maxn][maxn][maxn];long long ans=-9223372036854775100;void input(){cin>>A>>B>>C;ans=-9223372036854775100;for(int i=1;i<=A;i++)for(int j=1;j<=B;j++)for(int k=1;k<=C;k++){cin>>STEP1[i][j][k];}for(int i=1;i<=A;i++)for(int j=1;j<=B;j++)for(int k=1;k<=C;k++){STEP1[i][j][k]+=STEP1[i-1][j][k];}}long long STEP3[maxn];long long STEP2[maxn][maxn];void get_STEP3(int a,int b){for(int i=1;i<=C;i++)STEP3[i]=STEP2[b][i]-STEP2[a-1][i];for(int i=1;i<=C;i++){if(STEP3[i-1]>0)STEP3[i]+=STEP3[i-1];if(STEP3[i]>ans) ans=STEP3[i];}}void get_STEP2(int a,int b){for(int i=1;i<=B;i++)for(int j=1;j<=C;j++)STEP2[i][j]=STEP1[b][i][j]-STEP1[a-1][i][j];for(int i=1;i<=B;i++)for(int j=1;j<=C;j++)STEP2[i][j]+=STEP2[i-1][j];for(int i=1;i<=B;i++)for(int j=i;j<=B;j++){get_STEP3(i,j);}}void solve(){for(int i=1;i<=A;i++)for(int j=i;j<=A;j++){get_STEP2(i,j);}}int main(){//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);int T;cin>>T;while(T--){input();solve();cout<<ans<<endl;if(T!=0) cout<<endl;}return 0;}

转载于:https://www.cnblogs.com/zy691357966/p/5480441.html

【降维解法:最大字段和-最大子矩阵和-最终版最大子长方体和】【UVA10755】Garbage Heap...相关推荐

  1. SAP UI5 应用开发教程之四十七 - 如何自定义 SAP UI5 字符串类型输入字段的校验逻辑试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  2. java 反射操作字段_x86上的Java最终字段没有操作?

    java 反射操作字段 我一直很乐于深入研究多线程编程的细节,并且尽管阅读了多年的CPU内存一致性模型,无等待和无锁算法,Java内存模型,实践中的Java并发性等知识,但我总是很喜欢.等等-我仍然会 ...

  3. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  4. 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...

    hdu6370 Werewolf http://acm.hdu.edu.cn/showproblem.php?pid=6370 题意:村民只能说真话,狼人"可以"撒谎,每个人说一句 ...

  5. 使用 SQL Server 的 uniqueidentifier 字段类型

    原文:使用 SQL Server 的 uniqueidentifier 字段类型 SQL Server 自 2008 版起引入了 uniqueidentifier 字段,它存储的是一个 UUID, 或 ...

  6. tp5某个字段相同的数据只取一次_多维分析数据仓库建设建议-面向主题的建模...

    数仓使用数据库构建 数仓的作用简单来说就是存储数据和读取数据. 绝大部分情况下,数据是结构化的,因此存储数据使用数据库,使用SQL语言进行数据处理. 多维分析 多维分析是指使用数据的场景,查询时组合维 ...

  7. 以太网数据帧的报尾封装字段是什么_利用TCP/IP模型理解数据通信过程

    回顾TCP/IP模型 TCP/IP模型是当今IP网络的基础(由OSI七层参考模型发展而来,也称为DoD模型). 分层参考模型的设计是非常经典的理念: 层次化的模型设计将网络的通信过程划分为更小.更简单 ...

  8. 用姓名字段统计人数_基于 Wide amp; Deep 网络和 TextCNN 的敏感字段识别

    数据治理 (Data Governance) [1]作为一种数据管理的重要一环,主要目的在于保证数据在整个生命周期内的高质量性.数据治理的核心包括:数据的可用性 (Availability),易用性 ...

  9. 线性降维:PCA、LDA、MDS

    1. KNN 为什么要在介绍降维之前学习KNN呢?因为以KNN为代表的一类算法,由于其为非参数化模型,无法通过一组固定的参数和固定的模型进行表征.此外,KNN还是惰性学习算法的典型例子.惰性是指它仅仅 ...

最新文章

  1. java创建临时文件夹_如何在Java中创建一个临时目录/文件夹?
  2. Python基础教程:属性值设置和判断变量是否存在
  3. python用户界面导入图片_python学习笔记之11:图像用户界面
  4. leetcode 474. Ones and Zeroes | 474. 一和零(双约束背包问题)
  5. sales status change in ERP
  6. MySQL主从复制作用和原理
  7. c语言第一周作业答案,C语言程序设计下mooc答案.pdf
  8. python在工厂中的运用_在python中使用元类实现工厂设计模式
  9. 霍金临终论文公开:揭秘沉入黑洞的信息去向
  10. 1.为什么 要需要变量。二进制,方便,2.变量是什么 ,3.声明变量
  11. 设为首页 加入收藏代码
  12. CentOS7 KVM虚拟化技术 详解
  13. 陶哲轩实分析(上)8.2及习题-Analysis I 8.2
  14. [CTF攻防世界] WEB区 关于备份的题目
  15. 电子发票全流程电子化管理指南-摘要
  16. 电视机未来会成为家庭交互中心?
  17. oracle删除违反完整约束条件,ORA-02291: 违反完整约束条件 - 未找到父项关键字
  18. Python:strip() 函数
  19. 辅助 Excel 的数据计算 add-ins
  20. Coffee Chicken

热门文章

  1. 查看源代码Source not found及在eclipse中配置jdk的src.zip源代码
  2. linux下应用程序性能剖分神器gprofiler-tools-安装和使用
  3. mysql免安装教程
  4. RAC安装时需要执行4个脚本及意义
  5. React Native在移动端APP上实现拍照与照片上传功能
  6. 解决IE6下不支持 png24的透明图片问题
  7. 解决“The type initializer for‘Oracle.DataAccess.Client.OracleConnection‘ threw an exception ”异常
  8. 利用逻辑回归进行简单的人群分类解决广告推荐问题
  9. 【Linux】解决Linux服务器内存不足问题
  10. java异常类子类和父类的关系