【发布时间】:2015-06-23 05:44:53
【问题描述】:
我正在尝试这里提到的 Bytelandian 金币问题 - http://www.codechef.com/problems/COINS/ 这是它的解决方案之一 -
#include <stdio.h>
long int a[30][19]; //1
long int recur(long int n, int i, int j);
int main()
{
long int n;
int i, j;
while (scanf("%lld", &n) != EOF)
{
for (i = 0; i < 30;i++)
for (j = 0; j < 19; j++)
a[i][j] = 0;
long int v = recur(n, 0, 0);
printf("%lld\n", v);
}
return 0;
}
long int recur(long int n, int i, int j)
{
if (n <12 ) //2
return n;
else if (!a[i][j])
{
long int t = recur(n / 2, i + 1, j) + recur(n / 3, i, j + 1) + recur(n / 4, i + 2, j);
a[i][j] = t;
}
return a[i][j];
}
在这段代码中,我无法理解两点- 1-数组 a[30][19] 的大小,它基于输入数的最大值可被 2 或 3 整除的最大次数,他们使用一些对数基数为 2 或 3 的公式来查找。可以有人请解释这个公式,如果是的话,这是一些数学属性我在哪里可以找到有关它的更多信息。 2-停止递归 n
long int recur(long int n, int i, int j)
{
if ((n == 0) || (n == 1) || (n == 2) )
return n;
else if (!a[i][j])
{
long int t = recur(n / 2, i + 1, j) + recur(n / 3, i, j + 1) + recur(n / 4, i + 2, j);
a[i][j] = n> t ? n : t;
}
return a[i][j];
}
如果有人请解释以上2点,我将不胜感激
【问题讨论】:
-
注意:
"%lld"更改为"%ld"为long int。 -
我这样做了,但提交解决方案后得到了错误的答案。
-
a[27][17] 对于所有用例
标签: c recursion dynamic-programming memoization