我会将其编写为一个动态(递归)程序。
编写一个函数尝试在某个位置分割矩形,并对两个部分进行递归调用。尝试所有可能的分割并选择具有最小结果的那个。
基本情况是当两侧相等时,即输入已经是一个正方形时,结果为1。
function min_squares(m, n):
// base case:
if m == n: return 1
// minimum number of squares if you split vertically:
min_ver := min { min_squares(m, i) + min_squares(m, n-i) | i ∈ [1, n/2] }
// minimum number of squares if you split horizontally:
min_hor := min { min_squares(i, n) + min_squares(m-i, n) | i ∈ [1, m/2] }
return min { min_hor, min_ver }
为了提高性能,您可以缓存递归结果:
function min_squares(m, n):
// base case:
if m == n: return 1
// check if we already cached this
if cache contains (m, n):
return cache(m, n)
// minimum number of squares if you split vertically:
min_ver := min { min_squares(m, i) + min_squares(m, n-i) | i ∈ [1, n/2] }
// minimum number of squares if you split horizontally:
min_hor := min { min_squares(i, n) + min_squares(m-i, n) | i ∈ [1, m/2] }
// put in cache and return
result := min { min_hor, min_ver }
cache(m, n) := result
return result
在一个具体的C++实现中,您可以使用int cache[100][100]
作为缓存数据结构,因为您的输入大小是有限的。将其作为静态局部变量放置,这样它将自动初始化为零。然后将0解释为“未缓存”(因为它不能是任何输入的结果)。
可能的C++实现:http://ideone.com/HbiFOH