あなたはいくつかのレゴプラスチックレンガを持っています、すべてのレンガは1x1x1です。また、1xN(N <= 80)のタイルがあり、その上にLEGOブロックを配置する必要があります。それらを順番に並べることができます(3つ以上の連続したブリックがある場合は1つのシーケンスが正しいです)。また、2つのシーケンスの間に少なくとも1つの空きスペースが必要です。タイルにレンガを配置できるさまざまな組み合わせの数を計算する必要があります。
次に例を示します。
タイルが1x7の場合、17の異なる組み合わせがあります。
入力:7出力:17
(出典:mendo.mk)
また、レンガがない場合は、1つの組み合わせとしてカウントされます。
私はこの問題に取り組み、タイルの最大長が14(3シーケンス)である場合の可能な組み合わせを計算する方法を見つけました。forループを使用していることがわかりました。
私の最大の問題は、実行する必要のあるforループの数が非常に多いことです。たとえば、1つのシーケンスの場合は1 forループを使用し、2つのシーケンスの場合は2つのループ+ 1の1つのシーケンスを使用します...したがって、80のブロックすべてを使用する場合、20のシーケンスを作成でき、210を超えるforループを使用する必要があります。膨大な数。だから、1つに入れ子にできればいいですね。試してみましたが、めちゃくちゃになって正解しません。
新しいコード:
#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;
}