《程序员的算法趣题》笔记

Q23:二十一点通吃

啦啦啦,小伙伴们大家好啊,我来更新啦!

题目描述:

题目分析:

今天这道题比较简单,就是一个DFS(深度优先搜索)问题,可以用递归秒解。定义方法search,传递两个参数m, n,m表示当前手中硬币数,n表示尚需进行的游戏轮数,显然能得到递推关系F(m,n) = F(m-1, n-1) + F(m+1, n-1); 初始值F(s, 0) = 1(s > 0), F(0, t) = 0 (t >= 0)。所以是不是很简单呢。可是我再运行时却发现直接用递归写,一旦数据范围比较大的时候程序运行就很慢。原因很简单,就是低位做了大量的重复运算(或说所有直接用递归的程序都有这个毛病),所以开了两个数组一个储存每次的返回值,一个标识该位置是否计算过,从而实现了优化。

题目分析:

不说了,贴代码贴代码

/**

* 二十一点通吃

* @author zbc

*

*/

public class Q23 {

static int[][] dp;

static boolean[][] isExist;

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int m = sc.nextInt();

        int n = sc.nextInt();

        sc.close();

        System.out.println(getAns(m, n));

    }

    private static int getAns(int m, int n) {

        dp = new int[m+n+1][n+1];

        isExist = new boolean[m+n+1][n+1];

        return search(m, n);

    }

    private static int search(int k, int dep) {

        if(isExist[k][dep]) {

            return dp[k][dep];

        }

        if(k == 0) {

            return 0;

        }

        if(dep == 0) {

            return 1;

        }

        dp[k][dep] = search(k+1, dep-1)+search(k-1, dep-1);

        isExist[k][dep] = true;

        return dp[k][dep];

    }

}

你可能感兴趣的:(《程序员的算法趣题》笔记)