最大子矩阵问题总结

合集下载

最大子矩阵问题

最大子矩阵问题

最大子矩阵问题最大子矩阵问题最优子矩阵是建立在数列连续最大和的基础上的。

所谓最优子矩阵,就是指在一个n*m二维的矩阵中,确定一个小的矩阵,使这个小矩阵中所有元素的和最大。

思考一下最优子矩阵和连续最大和的异同:1、所求的和都具有连续性;2、连续最大和是一维问题,最优子矩阵是二维问题另外,对于一个矩阵而言,如果我们将连续k行的元素纵向相加,并对相加后所得的数列求连续最大和,则此连续最大和就是一个行数为k的最优子矩阵!由此,我们可以将二维的矩阵压缩成一维矩阵,转换为线性问题,从而求解。

其实就是将二维的问题,换成一维#include#include#include#define N 4 //matrix N*Nint getrand()int num = rand()%11-5;return num;void print_matrix(int A[N][N])for(i=0;ifor(j=0;jprintf("%d\t",A[i][j]);printf("\n");int max_sub_array(int B[], int n)int i = 0;int sum = 0;int max = 0;sum += B[i];if(sum>max)max = sum;else if(sumsum = 0;return max;int max_sub_matrix(int A[N][N])int last_i = 0;int last_j = 0;int max = 0;int tmp = 0;int array[N];/*i=0,表示包含第一行的最大子矩阵 i=1...类推*/ for(i=0;ifor(k=0;karray[k] = 0;for(j=i;jfor(k=0;karray[k] += A[j][k];tmp = max_sub_array(array, N);if(tmp>max)last_i = i;last_j = j;max = tmp;/*最大子矩阵开始和结束的行*/printf("last_i is %d, last_j is %d\n",last_i+1, last_j+1); return max;int main(int argc, char *argv[])int ret;int A[N][N];srand((unsigned int)time(NULL));for(i=0;ifor(j=0;jA[i][j] = getrand();print_matrix(A);ret = max_sub_matrix(A);printf("max is %d\n",ret);system("PAUSE");return 0;。

最大子矩阵问题

最大子矩阵问题

学习材料:王知昆《浅谈用极大化思想解决最大子矩阵问题》【最大子矩阵问题】在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的、轮廓与整个矩形平行或重合的最大子矩形。

【定义子矩形】有效子矩形:内部不包含障碍点的、轮廓与整个矩形平行或重合的子矩形。

极大子矩形:每条边都不能向外扩展的有效子矩形。

最大子矩形:所有有效子矩形中最大的一个(或多个)。

【极大化思想】在一个有障碍点的矩形中最大子矩形一定是极大子矩形。

设计算法的思路:枚举所有的极大子矩形,找到最大子矩形。

设NM分别为整个矩形的长和宽,S为内部的障碍点数。

【算法1】时间复杂度:O(S^2)空间复杂度:O(S)由于极大子矩形的每一条边都不能向外扩展,那么极大子矩阵的每条边要么覆盖了障碍点,要么与整个矩形的边界重合基本算法:枚举上下左右四个边界,然后判断组成的矩形是否是有效子矩形。

复杂度:O(S^5)可以改进的地方:产生了大量的无效子矩形。

初步改进的算法:枚举左右边界,然后对处在边界内的点排序,每两个相邻的点和左右边界组成一个矩形。

复杂度:O(S^3)可以改进的地方:枚举了部分不是极大子矩形的情况。

综上,设计算法的方向:1、保证每一个枚举的矩形都是有效的。

2、保证每一个枚举的矩形都是极大的。

算法的过程:枚举极大子矩形的左边界——>根据确定的左边界,找出相关的极大子矩形——>检查和处理遗漏的情况(1)按照横坐标从小到大的顺序将所有的点编号为1,2,3...(2)首先选取1号点作为要枚举的极大子矩形的左边界,设定上下边界为矩形的上下边界(3)从左到右扫描,第一次到2号点,确定一个极大子矩形,修改上下边界;第二次找到3号点,以此类推。

(4)将左边界移动到2号点,3号点,,,以同样的方法枚举遗漏的情况:1、矩形的左边界与整个矩形的左边界重合。

解决方法:用类似的方法从左到右扫一遍2、矩形的左边界与整个矩形的左边界重合,且矩形的右边界与整个矩形的右边界重合。

大数据面试题

大数据面试题

1、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。

所以不可能将其完全加载到内存中处理。

考虑采取分而治之的方法。

s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。

这样每个小文件的大约为300M。

s 遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为)。

这样处理后,所有可能相同的url都在对应的小文件()中,不对应的小文件不可能有相同的url。

然后我们只要求出1000对小文件中相同的url即可。

s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。

然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。

方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。

将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。

2、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。

要求你按照query的频度排序。

方案1:s、顺序读取10个文件,按照hash(query)的结果将query写入到另外10个文件(记为)中。

这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。

s、找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。

利用快速/堆/归并排序按照出现次数进行排序。

最大字段和问题描述

最大字段和问题描述

最大字段和问题描述一、什么是最大字段和哎呀,最大字段和这个东西呢,其实还挺有趣的。

简单来说呀,就是在一组数里面,找到一个连续的子序列,让这个子序列里的数加起来的和最大。

就像是在一堆宝藏里,找出一块最大价值的宝藏堆一样。

比如说,有这么一组数,1, -3, 5, -2, 4。

我们就得想办法从这里面找出连续的几个数,加起来得到最大的和。

这可不是随便乱找就行的哦。

二、最大字段和的计算方法这里面有好几种计算的方法呢。

有一种比较简单的想法,就是暴力破解法。

啥叫暴力破解法呢?就是把所有可能的连续子序列都找出来,然后一个一个计算它们的和,最后找出最大的那个和。

但是这种方法可有点笨笨的,要是数很多的话,那得计算好久好久呢。

还有一种聪明点的方法,就是动态规划的方法。

这个动态规划可就有点高大上啦。

我们可以定义一个数组,这个数组的每个元素都表示以这个位置结尾的最大子段和。

然后通过一定的规律去计算这个数组里的元素。

比如说,对于一个数a[i],它的最大子段和要么就是它自己,要么就是包含前面的数的最大子段和加上它自己。

这样一步一步算下来,就能很快地找到整个序列的最大子段和啦。

三、最大字段和在生活中的应用你可别小看这个最大字段和哦,它在生活中有好多用处呢。

比如说,在投资领域。

假如你有一支股票,它每天的涨跌幅度就可以看作是一组数。

那你想找到哪一段时间内你的收益最大,这就可以用最大字段和的方法来计算啦。

再比如说,在安排工作任务的时候。

每个任务都有一个收益值,但是任务之间有先后顺序,而且有些任务必须要在其他任务完成之后才能开始。

这时候,我们可以把每个阶段完成任务的收益看作是一组数,然后用最大字段和的方法来找出最优的任务安排顺序,让总的收益最大。

四、最大字段和的一些变化和扩展最大字段和还有一些变化呢。

比如说,二维的最大字段和。

就像是一个矩阵一样,我们要在这个矩阵里找出一个矩形区域,让这个矩形区域里的数加起来的和最大。

这个可比一维的要复杂多啦。

矩阵和子矩阵的秩的关系

矩阵和子矩阵的秩的关系

矩阵和子矩阵的秩的关系矩阵是线性代数中非常重要的概念之一,而矩阵的秩又是矩阵理论中一个重要的性质。

通过研究矩阵和子矩阵的秩的关系,可以深入理解矩阵的性质和运算规律。

我们先来了解一下矩阵的秩是什么。

矩阵的秩是指矩阵中的线性无关行(列)的最大个数,也可以理解为矩阵中非零行(列)的最大个数。

矩阵的秩可以表示矩阵的维度,也能反映出矩阵的行(列)空间的维度。

接下来我们来探讨一下矩阵和子矩阵的秩的关系。

对于一个矩阵A,它的任意一个子矩阵B的秩是小于等于A的秩的。

也就是说,子矩阵的秩不会超过原矩阵的秩。

这是因为子矩阵是从原矩阵中选取的一部分行和列,而行和列的选择是有限制的,因此子矩阵的维度不会超过原矩阵的维度。

举个例子来说明这个关系。

假设我们有一个3x3的矩阵A,其中的元素为:A = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]我们可以选取矩阵A的任意一个子矩阵B,假设B是一个2x2的子矩阵,选取的元素为:B = [[1, 2],[4, 5]]我们可以计算矩阵A和子矩阵B的秩,发现子矩阵B的秩为2,而矩阵A的秩也为2。

这符合我们之前的结论,子矩阵的秩不会超过原矩阵的秩。

除了子矩阵的秩不会超过原矩阵的秩之外,还有一个重要的性质是,矩阵A的秩等于它的转置矩阵A^T的秩。

也就是说,矩阵的秩不受到行和列的交换的影响。

这个性质在实际应用中非常有用,可以简化计算过程和提高计算效率。

进一步地,我们可以通过矩阵和子矩阵的秩的关系来推导出一些重要的结论。

例如,如果一个矩阵A的秩等于它的行数(或列数),那么矩阵A就是一个满秩矩阵。

满秩矩阵在线性代数和矩阵计算中有着重要的应用,可以用来表示线性无关的向量组,求解线性方程组等。

我们还可以利用矩阵和子矩阵的秩的关系来进行矩阵的分解和求逆等运算。

例如,对于一个矩阵A,如果它的秩等于它的行数(或列数),那么可以将矩阵A分解成两个非零矩阵的乘积,即 A = BC,其中B是一个m×r的矩阵,C是一个r×n的矩阵,m、n和r分别是矩阵A的行数、列数和秩。

矩阵分块法问题回答

矩阵分块法问题回答

矩阵分块法矩阵分块法是一种常用的矩阵计算方法,它将大规模的矩阵分割成若干个小块,然后对每个小块进行计算,最终将结果合并得到原始矩阵的计算结果。

这种方法可以有效地提高计算速度和减少内存占用。

一、矩阵分块法的基本思想矩阵分块法的基本思想是将大规模的矩阵划分成若干个小块,然后对每个小块进行计算。

这种方法可以有效地减少内存占用和提高计算速度。

具体来说,可以将一个 $n \times n$ 的矩阵划分成 $\sqrt{p} \times \sqrt{p}$ 个大小为 $\frac{n}{\sqrt{p}} \times\frac{n}{\sqrt{p}}$ 的子矩阵。

其中 $p$ 表示处理器数量。

二、矩阵乘法的分块实现对于两个 $n \times n$ 的矩阵 $A$ 和 $B$ 的乘积 $C = AB$,可以采用如下的分块实现:1. 将 $A$ 和 $B$ 分别划分为 $\sqrt{p} \times \sqrt{p}$ 个子矩阵:$$\begin{bmatrix}A_{11} & A_{12} & \cdots & A_{1\sqrt{p}} \\A_{21} & A_{22} & \cdots & A_{2\sqrt{p}} \\\vdots & \vdots & \ddots & \vdots \\A_{\sqrt{p}1} & A_{\sqrt{p}2} & \cdots & A_{\sqrt{p}\sqrt{p}} \end{bmatrix},B =\begin{bmatrix}B_{11} & B_{12} & \cdots & B_{1\sqrt{p}} \\B_{21} & B_{22} & \cdots & B_{2\sqrt{p}} \\\vdots & \vdots & \ddots& \vdots \\B_{\sqrt{p}1}& B_{\sqrt{p}2}& \cdots& B_{\sqrt{p}\sqrt{p}}\end{bmatrix}.$$其中 $A_{ij}$ 和 $B_{ij}$ 分别表示 $A$ 和 $B$ 的第 $i$ 行第 $j$ 列的子矩阵。

矩阵最高阶非零子式的求法

矩阵最高阶非零子式的求法

矩阵最高阶非零子式的求法矩阵最高阶非零子式的求法是线性代数中的一个重要问题。

在矩阵理论中,矩阵的子式是指从矩阵中任意选取若干行和若干列所组成的新矩阵的行列式。

矩阵的最高阶非零子式是指所有非零子式中行列数最大的那个子式。

求解矩阵的最高阶非零子式是矩阵理论中的一个基本问题,对于矩阵的性质分析和应用具有重要意义。

求解矩阵的最高阶非零子式的方法有很多种,其中比较常用的方法有以下几种:1. 高斯消元法高斯消元法是求解线性方程组的常用方法,也可以用来求解矩阵的最高阶非零子式。

具体方法是将矩阵进行初等变换,使得矩阵的某些行或列变为零,然后计算变换后的矩阵的行列式。

如果变换后的矩阵的某个子式不为零,则该子式就是原矩阵的一个非零子式。

重复进行初等变换,直到无法再进行初等变换为止,得到的最高阶非零子式就是原矩阵的最高阶非零子式。

2. LU分解法LU分解是将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积的方法。

具体方法是先对矩阵进行初等变换,将其变为一个上三角矩阵,然后再将其变为一个下三角矩阵。

在这个过程中,可以计算出每一步变换后的矩阵的行列式,从而得到原矩阵的所有非零子式。

最后,取行列数最大的非零子式作为原矩阵的最高阶非零子式。

3. 特征值法特征值法是求解矩阵特征值和特征向量的方法,也可以用来求解矩阵的最高阶非零子式。

具体方法是先求解矩阵的特征值和特征向量,然后将特征向量组成的矩阵进行初等变换,得到一个上三角矩阵。

最后,取上三角矩阵的对角线上的元素的乘积作为原矩阵的最高阶非零子式。

总之,求解矩阵的最高阶非零子式是线性代数中的一个基本问题,有多种求解方法。

在实际应用中,可以根据具体问题的特点选择合适的方法进行求解。

【java】矩阵的最大子矩阵(动态规划)

【java】矩阵的最大子矩阵(动态规划)

【java】矩阵的最⼤⼦矩阵(动态规划)⼀、实验⽬的练习使⽤动态规划算法解决实际问题(使⽤Java语⾔实现)。

⼆、实验内容【问题描述】有⼀个包含正数和负数的⼆维数组。

⼀个⼦矩阵是指在该⼆维数组⾥,任意相邻的下标是1*1或更⼤的⼦数组。

⼀个⼦矩阵的和是指该⼦矩阵中所有元素的和。

本题中,把具有最⼤和的⼦矩阵称为最⼤⼦矩阵。

【⽰例】给出以下⼆维数组:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2这个数组的最⼤⼦矩阵为:9 2-4 1-1 8其和为15。

【输⼊】输⼊包含多组测试数据。

每组输⼊的第⼀⾏是⼀个正整数N(1<=N<=100),表⽰⼆维⽅阵的⼤⼩。

接下来N⾏每⾏输⼊N个整数,表⽰数组元素,范围为[-127,127]。

【输出】输出最⼤⼦矩阵和。

【思路提⽰】求最⼤⼦矩阵和问题是求最⼤⼦段和问题在⼆维空间上的推⼴,可参考求最⼤⼦段和问题。

三、 程序代码(1)maxSumList1package maxSumList;2import java.util.Scanner;34public class maxList{5 //public static int[][] list=new int[10][10];6 static int n;7 private maxSingleList maxSingleList=new maxSingleList();8 private final maxSingleList[] maxSingleLists;9 private int numberOfmaxSingleLists;1011 public maxList() {12 //创建计算每个⼦段和的类的数组13 maxSingleLists=new maxSingleList[100];14 }15161617 public void InputList(int[][] list){1819 System.out.println("请输⼊⽅阵⼤⼩:");20 Scanner scanner=new Scanner(System.in);21 n=scanner.nextInt();22 for (int y=0;y<n;y++){23 System.out.println("请输⼊⽅阵第"+(y+1)+"⾏数据:");24 for (int x=0;x<n;x++)25 list[y][x]=scanner.nextInt();26 }27 }28 public void OutputMaxSumList(int[][] list){29 int m=0;30 int max=0;31 int max1=0;32 int maxnum=0;3334 for (m=0;m<=numberOfmaxSingleLists;m++) {35 max1=maxSingleLists[m].getSum();36 if (max1 > max) {37 max = max1;38 maxnum = m;39 }40 }41 System.out.println("请输出最⼤⼦段和:"+maxSingleLists[maxnum].getSum());42 System.out.println("请输出最⼤⼦段:");43 for(int i=maxSingleLists[maxnum].getY1();i<=maxSingleLists[maxnum].getY2();i++){44 for (int j=maxSingleLists[maxnum].getNum1();j<=maxSingleLists[maxnum].getNum2();j++){45 System.out.print(list[i][j]+" ");46 }47 System.out.println("\n");48 }49 }5051 public void subMaxList(int[][] matrix) {52 int m=0;53 int[][] total = new int[10][10];54 for (int y=0;y<n;y++){55 for (int x=0;x<n;x++)56 total[y][x]=matrix[y][x];57 }585960 for (int i = 1; i < n; i++) {61 for (int j = 0; j < n; j++) {62 total[i][j] += total[i-1][j];63 }64 }6566 int maximum = 0;//Integer.MIN_VALUE;67 for (int i = 0; i < n; i++) {//所在的list⾏68 for (int j = i; j <n; j++) {//相差的69 //result 保存的是从 i ⾏到第 j ⾏所对应的矩阵上下值的和70 int[] result = new int[matrix[0].length];//每次都重新定义存放⼦段和的结果数组71 for (int f = 0; f < n; f++) {72 if (i == 0) {73 result[f] = total[j][f];74 } else {75 result[f] = total[j][f] - total[i - 1][f];76 }77 }78 maxSingleList maxSingleList=new maxSingleList();79 int maximal=maxSingleList.MaxListNum(result,i,j);80 numberOfmaxSingleLists=m;81 maxSingleLists[m++]= maxSingleList;81 maxSingleLists[m++]= maxSingleList;82 if (maximal > maximum) {83 maximum = maximal;84 }85 }86 }87 }8889}(2)maxSingleList4 private int num1;5 private int num2;6 private int y1;7 private int y2;8 private int sum;9 public int getNum1(){10 return num1;11 }12 public int getNum2(){13 return num2;14 }15 public void setY1(int y11){16 y1=y11;17 }18 public void setY2(int y22){19 y2=y22;20 }21 public int getY1(){22 return y1;23 }24 public int getY2(){25 return y2;26 }27 public void setSum(int sum){28 this.sum=sum;29 }30 public int getSum(){31 return sum;32 }33 public int MaxListNum(int[] array,int i,int j){34 int number,b=0,begin=0,bestmin=0,bestmax=0;35 sum=0;36 for (number = 0; number < array.length; number++) {//sum没清零37 if (b >= 0)//去掉等号38 b += array[number];39 else {40 b = array[number];41 begin = number;42 }43 if (b > sum) {//加个+44 sum = b;45 bestmin = begin;46 bestmax = number;47 }4849 }50 num1 = bestmin;51 num2= bestmax;52 setSum(sum);53 setY1(i);54 setY2(j);55 return sum;56 // if (sum==0)和为0的⾏数组要去掉那⼀⾏5758 }5960 }(3)TestmMaxList4 public static int[][] list=new int[10][10];5 public static void main(String[] arg){6 maxList maxlist=new maxList();7 maxlist.InputList(list);8 maxlist.subMaxList(list);9 maxlist.OutputMaxSumList(list); 1011 }12}四、 实验结果(含程序运⾏截图)五、 出现问题及解决⽅法(⼀)出现的问题在于算法的设计上,⼀开始我认为最⼤⼦矩阵就是每⾏所构成的最⼤⼦段的⾏列的序号交集,后来发现不是这样的,这样没办法正确输出最⼤⼦矩阵,得到的结果不对,然后推翻⾃⼰写了⼀天的代码以及想法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Largest Rectangle in a HistogramTime Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Submission(s) : 53 Accepted Submission(s) : 8Problem DescriptionA histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles:Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.InputThe input contains several test cases. Each test case describes a histogram and starts with an integer n, denoting the number of rectangles it is composed of. You may assume that 1 <= n <= 100000. Then follow n integers h1, ..., hn, where 0 <= hi <= 1000000000. These numbers denote the heights of the rectangles of the histogram in left-to-right order. The width of each rectangle is 1. A zero follows the input for the last test case.OutputFor each test case output on a single line the area of the largest rectangle in the specified histogram. Remember that this rectangle must be aligned at the common base line.Sample Input7 2 1 4 5 1 3 34 1000 1000 1000 1000Sample Output84000这个题目是众多子矩阵问题的源头,所以要好好总结一下。

重点:对于每个点,记算出他所能向左和向右延伸的最大边界,该长度乘以该点高度就是该店所能呈现的最大值,最后扫描一边找出最大的。

对于某个点,如果该点的高度比左边的一个小,那么该点的左边界就是这个点左边的点的左边界。

右边界亦是如此。

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;const int N=100010;long long a[N],l[N],r[N];int main(){int n;while(cin>>n&&n){int i,j;for(i=1;i<=n;i++){//cin>>a[i];scanf("%I64d",&a[i]);l[i]=r[i]=i;}for(i=1;i<=n;i++){ //延伸左边界while(l[i]>1&&a[i]<=a[l[i]-1])l[i]=l[l[i]-1];}for(i=n;i>0;i--){ //延伸右边界while(r[i]<n&&a[i]<=a[r[i]+1])r[i]=r[r[i]+1];}long long ans=0;for(i=1;i<=n;i++){ans=max(ans,(r[i]-l[i]+1)*a[i]);}cout<<ans<<endl;}return 0;}City GameTime Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Submission(s) : 12 Accepted Submission(s) : 5Problem DescriptionBob is a strategy game programming specialist. In his new city building game the gaming environment is as follows: a city is built up by areas, in which there are streets, trees,factories and buildings. There is still some space in the area that is unoccupied. The strategic task of his game is to win as much rent money from these free spaces. To win rent money you must erect buildings, that can only be rectangular, as long and wide as you can. Bob is trying to find a way to build the biggest possible building in each area. But he comes across some problems – he is not allowed to destroy already existing buildings, trees, factories and streets in the area he is building in.Each area has its width and length. The area is divided into a grid of equal square units.The rent paid for each unit on which you're building stands is 3$.Your task is to help Bob solve this problem. The whole city is divided into K areas. Each one of the areas is rectangular and has a different grid size with its own length M and width N.The existing occupied units are marked with the symbol R. The unoccupied units are marked with the symbol FInputThe first line of the input contains an integer K – determining the number of datasets. Next lines contain the area descriptions. One description is defined in the following way: The first line contains two integers-area length M<=1000 and width N<=1000, separated by a blank space. The next M lines contain N symbols that mark the reserved or free grid units,separated by a blank space. The symbols used are:R – reserved unitF – free unitIn the end of each area description there is a separating line.OutputFor each data set in the input print on a separate line, on the standard output, the integer that represents the profit obtained by erecting the largest building in the area encoded by the data set.Sample Input25 6R F F F F FF F F F F FR R R F F FF F F F F FF F F F F F5 5R R R R RR R R R RR R R R RR R R R RR R R R R此题为最大01子矩阵,是上面一个题的加强版。

相关文档
最新文档