记忆化搜索实际上是递归来实现的,但是递归的过程中有许多的结果是被反复计算的,这样会大大降低算法的执行效率。
而记忆化搜索是在递归的过程中,将已经计算出来的结果保存起来,当之后的计算用到的时候直接取出结果,避免重复运算,因此极大的提高了算法的效率
import java.util.Scanner;
public class Main {
public static final int f[][][] =new int[30][30][30];//开辟一个数组 f[][][],用来存储计算出来的结果
public static void main(String[] args) {
Scanner scanner = new Scanner (System.in);
boolean falg = true;
int a = 0,b = 0,c = 0;
//输入数据
while(falg) {
a = scanner.nextInt();
b = scanner.nextInt();
c = scanner.nextInt();
if(a==-1&&b==-1&&c==-1) {
break;
} else {
System.out.println("w("+a+", "+b+", "+c+") = "+w(a, b, c));
}
}
scanner.close();
}
//记忆搜索(递归)
public static int w(int a,int b,int c) {
if(a<=0 || b<=0 || c<=0) {
return 1;
}else if(a>20 || b>20 || c>20) {
return w(20,20,20);
}else if(f[a][b][c]!=0) {
return f[a][b][c]; //如果之前被计算过,那么直接返回存在数组中的结果;没有计算过的,就进行的计算
}else if(a<b && b<c) {
f[a][b][c] = w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
}else {
f[a][b][c] = w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
}
return f[a][b][c];
}
}