Java洛谷P1464 Function

Java洛谷P1464 Function_第1张图片

Java洛谷P1464 Function_第2张图片

题目链接:https://www.luogu.com.cn/problem/P1464

知识讲解:

记忆化搜索实际上是递归来实现的,但是递归的过程中有许多的结果是被反复计算的,这样会大大降低算法的执行效率。

而记忆化搜索是在递归的过程中,将已经计算出来的结果保存起来,当之后的计算用到的时候直接取出结果,避免重复运算,因此极大的提高了算法的效率

代码实例:

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

}

你可能感兴趣的:(洛谷)