码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1579 Function Run Fun 记忆化递归

时间:2017-04-22 14:54:19      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:下标   规划   run   ==   limit   print   can   val   记忆化   

典型的记忆化递归问题。

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

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

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


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



POJ 1579 Function Run Fun 记忆化递归

标签:下标   规划   run   ==   limit   print   can   val   记忆化   

原文地址:http://www.cnblogs.com/mthoutai/p/6747514.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!