【发布时间】:2021-05-31 11:11:01
【问题描述】:
任务:
假设一个大小为 n × m 的矩形。确定最小平方数 需要平铺矩形。
我尝试了以下方法:
#include <stdlib.h>
#include <math.h>
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
int matrix(int n, int m)
{
int dp[n+1][m+1];
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
dp[i][j] = INFINITY;
}
}
return MinSquare(n, m, dp);
}
int MinSquare(int n, int m, int dp[n][m])
{
int horizontalMin = INFINITY;
int verticalMin = INFINITY;
if(n==m)
{
dp[m][n] = 1;
return 1;
}
if(dp[n][m] != INFINITY)
{
return dp[n][m];
}
for(int i=1;i<=n;i++)
{
verticalMin = MIN(MinSquare(i,m,dp)+ MinSquare(n-i,m,dp), horizontalMin);
}
for(int i=1;i<=m;i++)
{
horizontalMin = MIN(MinSquare(n,i,dp)+MinSquare(n,m-i,dp), horizontalMin);
}
dp[n][m] = MIN(verticalMin, horizontalMin);
return dp[n][m];
}
int main()
{
printf("%d", matrix(3,4));
return 0;
}
这导致 2147483647,我不明白为什么我的代码不能正确运行。
有什么提示吗?
【问题讨论】:
-
另一个问题是你递归调用
MinSquare,改变了m和n的值。这不起作用,因为第三个参数取决于m。我很惊讶编译器没有发出警告!\ -
算法看起来太简单了。在there 网站上,他们提出了同样的问题,但也给出了一些例子。这里的算法不会解决那里最复杂的例子。
-
@anatolyg 你说得对——如果实施得当,如果你要求每个剪辑都一直穿过一块,这个算法将解决问题。
-
我不明白为什么正方形可以比矩形大。因为在一次迭代中 m 是固定的,而另一个是可变的,而在第二次迭代中则相反。
-
请不要以使现有答案无效的方式编辑问题。 Stack Overflow 不是个人调试服务。它旨在成为一个持久的问题和答案存储库,为将来的其他读者提供服务。他们应该找到一个明确提出的问题和答案。
标签: c dynamic-programming