问题陈述是找到覆盖大小为n乘m的矩形网格所需的最小平方数,其边强度为2 。
我写了以下代码:
ll solve(ll n,ll m)
{
if(n==0||m==0)
return 0;
else if(n%2==0&&m%2==0)
return solve(n/2,m/2);
else if(n%2==0&&m%2==1)
return (solve(n/ 2,m/ 2));
else if(n%2==1&&m%2==0)
return (solve(n/ 2,m/ 2));
else
return (n+m-1+solve(n/2,m/2));
}
建议我,因为它给出了错误的答案。
答案 0 :(得分:0)
W.l.o.g。我们说n> = m并选择m为2 ^ x的形式。 (如果m是任意的< = n,它也只意味着我们将相同的方法应用于第二个矩形,其大小为m-2 ^ x,其中x = int_floor(ld(m)),ld是log当然是2的基数。)
以下代码段应计算所需的方格数。
countSquares(m,n,x) :
if n == 0 : return 0
if n == 1 : return m
if n/2^x >= 1 :
return m/2^x + countSquares(m,n-2^x,x-1)
else
countSquares(m,n,x-1)
第3个if中的返回:m / 2 ^ x总是一个自然数,因为m的开头是2 ^ x,任何2 ^(x-(xi))都是自然数。
如果我们只对下限感兴趣。我假设选择一个大小为a次b的矩形,其中a:= 2 ^ x - 1,b:= 2 ^ y -1应该导致大约ld(a)乘以ld(b)的平方数。
将代码片段扩展为任意m似乎涉及第二次递归:
partitionAndCount(n,m) :
if n < m : swap(n,m)
var x = floor(ld(m))
var mRes = m - 2^x
if mRes == 0 : return countSquares(2^x,n,x-1)
if mRes == 1 : n + return countSquares(2^x,n,x-1)
return partitionAndCount(n,mRes) + countSquares(2^x,n,x-1)