[NOIP 2003 普及组] 栈 Java
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[n + 1];
dp[0] = 1; // 空序列只有一种方式
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
System.out.println(dp[n]);
}
}
对于长度为i的序列,枚举数字1出栈的位置j,分解成两个子问题:① j 前面 j - 1 数字的出栈顺序数 dp[j - 1];② j 后面 i - j 个数字的出栈顺序数 dp[i - j]。