LA3029最大子矩阵 |
【题目描述】:给定m*n的矩阵,其中一些格子是空格F,其他是墙R。找出一个全部由空地组成的面积最大的子矩阵,输出面积。 |
【算法分析】: 【决策方案】:所有的子矩阵,C(n,2)*C( m,2)种,加上确认空地,大约N^6的复杂度 【限制条件】:所有的方块都是空地 【最优评判准则】:面积最大 【思路分析】: 朴素算法的复杂度是N^6,肯定不能接受,所以我们看是否记忆化扫描一些变量。一个矩阵面积的关键量是长h和宽d。参考《指南》上的思路,分别用数组表示每一个矩阵的h和d,但问题又来了,矩阵本身都有n^4种,不可能存储下来。所以我们可以换一种方式。用[I][J]代表以这一点为中心,假设这一点包含在一个空着的矩形中,那么能取到的面积是多少?为了让递递推变量更少,我们只统计up[i][j]这点向上的空格数,left[i][j].向左的最大延伸(记住,我们需要形成矩形,所以更坏的情况是向右逼近),同理,right[i][j]是右边的。 因为我们上从上到下,从两边逼近,所以: lefts[i][j]=max(lefts[i-1][j],lo+1); Lo是从左到有的标记量,if (map[i][j]=='F') lo=j; Right同理,详见代码。 【难点】:思路本身(数学建模的过程)、写递推时要考虑到所有情况 |
【完整代码】: 1 #include
|
【关键词】:数学,递推扫描 |