POJ 1579 Function Run Fun 记忆化递归

典型的记忆化递归问题。

这类问题的记忆主要是利用数组记忆。那么已经计算过的值就能够直接返回。不须要进一步递归了。

注意:下标越界。递归顺序不能错,及时推断是否已经计算过值了,不要多递归。

或者直接使用动态规划法填好表也是能够的。

#include <stdio.h>
#include <limits.h>

const int MAX_N = 21;
int W[MAX_N][MAX_N][MAX_N];

int getValue(int a, int b, int c)
{
	if (a <= 0 || b <= 0 || c <= 0) return W[0][0][0] = 1;
	if (a >= MAX_N || b >= MAX_N || c >= MAX_N)
		return getValue(MAX_N-1, MAX_N-1, MAX_N-1);

	if (W[a][b][c]) return W[a][b][c];

	if (a < b && b < c)
	{
		W[a][b-1][c-1] = getValue(a, b-1, c-1);
		W[a][b][c-1] = getValue(a, b, c-1);
		W[a][b-1][c] = getValue(a, b-1, c);
		return W[a][b][c] = W[a][b][c-1] + W[a][b-1][c-1] - W[a][b-1][c];
	}

	W[a-1][b-1][c-1] = getValue(a-1, b-1, c-1);
	W[a-1][b-1][c] = getValue(a-1, b-1, c);
	W[a-1][b][c-1] = getValue(a-1, b, c-1);
	W[a-1][b][c] = getValue(a-1, b, c);

	return W[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];
}

int main()
{
	int a, b, c;
	while (~scanf("%d %d %d", &a, &b, &c)&& !(a == -1 && b == -1 && c == -1))
	{
		printf("w(%d, %d, %d) = %d\n", a, b, c, getValue(a, b, c));
	}
	return 0;
}
时间: 2024-10-10 21:45:22

POJ 1579 Function Run Fun 记忆化递归的相关文章

POJ 1579 Function Run Fun 记忆化搜索

Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 1 if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: w(20, 20, 20) if a &

POJ1579:Function Run Fun(记忆化)

Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 1 if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: w(20, 20, 20) if a &

POJ 1579 Function Run Fun 【记忆化搜索入门】

题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20560   Accepted: 10325 Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <=

poj 1579(动态规划初探之记忆化搜索)

Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17843   Accepted: 9112 Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b

POJ 1579 Function Run Fun

这题时简单的dp题,不过我也就能写写这样简单的题了,不过注意一点. 没什么说的,直接按照题目顺序就可以了. #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<cmath> using namespace std; int dp[21][21][2

wikioi天梯 1011 数的计算 (记忆化递归)

题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.          不作任何处理; 2.          在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3.          加上数后,继续按此规则进行处理,直到不能再加自然数为止. 输入描述 Input Description 一个数n 输出描述 Output Description 满足条件的数的个数 样例

Bailian1664 Placing apples【递推+记忆化递归】

1664:Placing apples 总时间限制: 1000ms 内存限制: 65536kB 描述 We are going to place M same apples into N same plates. There could be some empty plates. How many methods do we have? When we have 7 applesand 3 plates, the methods, (1, 5, 1) and (5, 1, 1) are the

poj 1661 Help Jimmy(记忆化搜索)

题目链接:http://poj.org/problem?id=1661 一道还可以的记忆化搜索题,主要是要想到如何设dp,记忆化搜索是避免递归过程中的重复求值,所以要得到dp必须知道如何递归 由于这是个可以左右移动的所以递归过程肯定设计左右所以dp的一维为从左边下或者从右边下,而且和层数有关所以另一维为层数 于是便可以得到dp[count][flag],flag=1表示count层从左边下要多久,flag=0表示count层从右边下要多久.然后就是dfs的递归 过程 #include <iost

POJ 1351 Number of Locks (记忆化搜索 状态压缩)

Number of Locks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1161   Accepted: 571 Description In certain factory a kind of spring locks is manufactured. There are n slots (1 < n < 17, n is a natural number.) for each lock. The height