【发布时间】:2020-09-13 01:04:29
【问题描述】:
您好,我的任务是将指数代码转换为线性代码,但我不知道该怎么做。您能给我一些提示或指出正确的方向吗?
代码如下:
int F (int m, int n)
{
if(n == 0)
{
return m;
}
else if(m == 0 && n > 0)
{
return n;
}
else
{
int[] array = { 1 + F(m - 1, n), 1 + F(m, n - 1), D(m, n) + F(m - 1, n - 1) };
return array.Min();
}
}
int D(int i, int f)
{
if(x[i] == y[f])
{
return 1;
}
else
{
return 0;
}
}
更新:
我的方向正确吗?到目前为止,它仅适用于 m=0,1,2 和 n=0,1,2。如果假设我给出 m = 10 和 n = 20,我该如何填写所有值?
int Fdp(int m, int n)
{
fdin[m, 0] = m;
for(int i = 0; i <= n; i++)
{
fdin[0, i] = n;
}
if (n == 0)
{
return m;
}
else if (m == 0 && n > 0)
{
return n;
}
else
{
int[] temp = { 1 + fdin[m-1, n], 1+ fdin[m,n-1], D(m,n) + fdin[m-1,n-1] };
fdin[m, n] = temp.Min();
return temp.Min();
}
}
【问题讨论】:
-
一种方法是 memoization:将已知(计算)
D和F值放入字典中,不再计算它们。 -
通常,在尝试优化这样的事情时,理解 intent 是关键,这样您就可以将其概念化并考虑实现相同目的的替代方法,而无需计算一切(例如,当某些值不可能成为必要时,合理化);当你只有
F、D、i、f、m和n时,很难将某些东西概念化。