这是问题:给定一个介于3和200之间的砖块数n,返回可以构建的不同楼梯数量。每种类型的楼梯应包括2个或更多级别。不允许两级别处于相同高度-每一步必须比前一步低。所有步骤都必须至少包含一个砖块。一级别的高度被定义为组成该级别的所有砖块的总量。
例如,当N = 3时,您只有一种选择来构建楼梯,第一步高度为2,第二步高度为1: (#表示一个砖块)
当 N = 4 时,你仍然只有 1 种楼梯选择:
特别是,如何确定数组中每个连续条目之间的关系?
例如,当N = 3时,您只有一种选择来构建楼梯,第一步高度为2,第二步高度为1: (#表示一个砖块)
#
##
21
当 N = 4 时,你仍然只有 1 种楼梯选择:
#
#
##
31
然而,当N = 5时,你可以用给定的砖块建造两种不同的楼梯。这两个楼梯的高度分别为(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;
}
}
特别是,如何确定数组中每个连续条目之间的关系?