【发布时间】:2012-05-10 21:11:44
【问题描述】:
您有一些乐高塑料积木,所有积木都是 1x1x1。此外,您还有一块 1xN (N
这是一个例子:
如果图块是 1x7,则有 17 种不同的组合。
输入:7 输出:17
(来源:mendo.mk)
此外,如果您没有积木,则算作 1 个组合。
我已经解决了这个问题,并且我找到了计算图块的最大长度是否为 14(3 个序列)的可能组合的方法。我发现它使用 for 循环。
我最大的问题是我需要运行大量的 for 循环。例如,对于 1 个序列,我使用 1 个 for 循环,对于 2 个序列,2 个循环 + 1 个用于 1 个序列......所以如果我使用所有 80 个砖块,我可以创建 20 个序列,我将不得不使用超过 210 个 for 循环,即数量巨大。因此,如果我可以将它们嵌套在一个中,那就太好了。我试过了,结果很乱,而且没有给出正确的答案。
新代码:
#include <iostream>
using namespace std;
int main()
{
long long int places, combinations = 1;
cin >> places;
long long int f[80], g[80];
f[0] = 0;
f[1] = 0;
f[2] = 0;
g[0] = 1;
g[1] = 1;
g[2] = 1;
for(int i = 3; i<=places; i++)
{
f[i] = f[i-1] + g[i-3];
g[i] = f[i-1] + g[i-1];
}
combinations = f[places] + g[places];
cout << combinations;
return 0;
}
【问题讨论】:
-
你可以通过女巫使用类,你只需要这样做一次,然后一遍又一遍地使用类
-
我真的不知道它会对我有什么帮助,而且我没有上课的经验,所以请发布一个小例子。如果您没有注意到 1 序列的算法与 2 的算法不同,依此类推
-
你能解释一下吗?
also you must have at least 1 empty space between 2 sequences。您的示例与此陈述不一致 -
从算法上讲,我不禁注意到砖块的存在与否是
bit的binary状态,而你基本上是shift模式... :- ) -
@Mayank 我认为必须连续有 3 个或更多红砖才有效。如果有多个序列,则它必须至少有 1 个砖间隙。 OP 中只有一个 2 个序列的示例(第 3 行的第一个)
标签: c++ algorithm loops combinations lego