以下是spoj problem (krect)陈述
给出M * N方板。每个方块都包含一个英文字母('A'..'Z')。
板的K矩形是一个矩形,其边与板的两侧平行,并且包含正好K种不同类型的字母
例如,使用这个4 * 3板:
CED
CEB
CBC
DDA
矩形[(1,1),(2,2)]是板的2个矩形,因为它包含2个不同的字母:C和E.
给出M,N,K和M * N板。确定电路板中有多少个K矩形。
你能提出任何解决方案吗?所有想法都很好看
答案 0 :(得分:0)
天真的解决方案,检查每个可能的矩形,要求您在100x100的情况下查看25502500个矩形。您可以通过注意到K字形中不能包含K字母以上的矩形,以及K字母少于K字母的矩形不能包含K矩形来剪切它。
答案 1 :(得分:0)
对问题的评论似乎表明O(n ^ 4)解决方案可以正常工作,因此所有左上角的外环和所有宽度和高度的内环都足够了。诀窍是有效地扫描可能的矩形尺寸,例如,如果K = 6,则没有点测试小于6的面积矩形。我建议您保留一个矩形尺寸的2D阵列进行扫描,然后沿对角线扫描
1 x .....6
2 x ..3
3 x .2
4 x .2
5 x .2
6 x 1
如果在任何时候你发现一个矩形的K个符号超过K个,你知道没有更宽或更高的矩形可能是一个解决方案。
答案 2 :(得分:0)
答案 3 :(得分:0)
对于时间复杂度为O(a * n ^ 3)的问题,有一种简单的方法。 这里是一个字母数组的常量大小。
解决方案:
从棋盘上的每个方格(按顺序进行),您可以创建一个矩形。这将具有O(n ^ 3)的时间复杂度。现在为每个矩形更新一个字母数组。这里涉及一些动态编程。您可以通过处理以(j-1,k)和(j,k-1)结尾的矩形的两个数组来更新以square(j,k)结尾的矩形的数组。
如果您有其他疑问,请参阅下面给出的链接。