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];
}
}