これは問題です。レンガの数nが3〜200の場合、ビルド可能な階段の数を返します。階段の各タイプは2つ以上の階段で構成する必要があります。同じ高さに2つのステップがあることは許されません - 各ステップは以前のものよりも低くなければなりません。すべてのステップには、少なくとも1つのレンガを含める必要があります。ステップの高さは、そのステップを構成するレンガの総量として分類されます。ダイナミックプログラミングソリューションの説明
たとえば、N = 3の場合、階段を作成する方法は1つしかありません。最初のステップの高さは2、次のステップの高さは1です。(#はレンガを示します)
#
##
21
N = 4、あなたはまだのみ1段の階段の選択肢がある場合:
#
#
##
31
しかし、N = 5を、あなたが与えられたレンガの階段を構築することができる2つの方法があります。 2段の階段は高持つことができます(4、1)または(3、2)、以下に示すよう:
#
#
#
##
41
#
##
##
32
を私はオンライン解決策を見つけたが、私は非常に直感的に動的なプログラミングソリューションを理解していません。
public class Answer {
static int[][] p = new int[201][201];
public static void fillP() {
p[1][1] = 1;
p[2][2] = 1;
for (int w = 3; w < 201 ; w++) {
for (int m = 1; m <= w; m++) {
if (w-m == 0) {
p[w][m] = 1 + p[w][m-1];
} else if (w-m < m) {
p[w][m] = p[w-m][w-m] + p[w][m-1];
} else if (w-m == m) {
p[w][m] = p[m][m-1] + p[w][m-1];
} else if (w-m >m) {
p[w][m] = p[w-m][m-1] + p[w][m-1];
}
}
}
}
public static int answer(int n) {
fillP();
return p[n][n] - 1;
}
}
特に、配列内の連続した各エントリ間の関係はどのようになりますか?
ありがとうございました! :)それは楽しい挑戦です! –