SPOJ KRECT问题:计算K-Rectangle

时间:2011-03-07 13:52:15

标签: algorithm dynamic-programming

以下是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矩形。

你能提出任何解决方案吗?所有想法都很好看

4 个答案:

答案 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)结尾的矩形的数组。

如果您有其他疑问,请参阅下面给出的链接。

http://apps.topcoder.com/forums/;jsessionid=662C6CE6626AB8343C7C018332CBF23D?module=Thread&threadID=666525&start=0&mc=8#1208270