卡特兰数 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

posted @ 2020-12-01 10:46  姓蜀名黍  阅读(89)  评论(0)    收藏  举报