卡特兰数 P1044
package pro.算法定向练习.数据结构; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Stack_P1044 { static int N, answer; static int[][] memory, dp, c; static int[] d; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); //1. 记忆化搜素 // 用下标i表示队列还有几个待排的数 // j表示栈里有j个数 // memory = new int[N+1][N+1]; // answer = dfs(N, 0); // System.out.println(answer); //2. 递推 /*dp = new int[N+1][N+1]; for (int i = 1; i <= N; i++) { dp[0][i] = 1;// 没有待排的数只有一种方法出栈 } for (int i = 1; i <= N; i++) { for (int j = 0; j < N; j++) { if(j > 0) dp[i][j] += dp[i][j-1]; dp[i][j] += dp[i-1][j+1]; } } System.out.println(dp[N][0]); */ //3. 卡特兰/CatalanCatalan 递推 // f[n]=f[0]∗f[n−1]+f[1]∗f[n−2]+...+f[n−1]∗f[0](n≥2) d = new int[N]; d[0] = d[1] = 1; for (int i = 2; i <= N; i++) { for (int j = 0; j < i; j++) { d[i] += d[j] * d[i-j-1]; } } System.out.println(d[N]); // h[n]=C[2n,n]−C[2n,n−1](n=0,1,2,...) c = new int[2 * N +1][2 * N +1]; for (int i = 1; i <= 2 * N; i++) { c[i][0] = c[i][i] = 1; for (int j = 1; j < i; j++) { c[i][j] = c[i-1][j] + c[i-1][j-1]; } } System.out.println(c[2*N][N] - c[2*N][N-1]); } private static int dfs(int i, int j) { if(memory[i][j] != 0) return memory[i][j]; if(i == 0) return memory[i][j] = 1; // 如果全部在栈里面,只有一种方法 if(j > 0) memory[i][j] += dfs(i, j-1); // 栈里面有数 memory[i][j] += dfs(i-1, j+1); // 栈里面没数 return memory[i][j]; } }
参考别人的题解地址 https://www.luogu.com.cn/problem/solution/P1044

浙公网安备 33010602011771号