洛谷P1464

很简单的一个记忆化搜索

记忆化搜索

百度解释:一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。

实际上:记忆化搜索可以看作搜索形式(比如dfs)和动态规划的结合,扬长避短。再简单一点就是另外开一个数组来储存之前递归过程中的结果,以便下次遇到直接调用

上代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
LL a, b, c;
LL vis[25][25][25];

LL w(LL x, LL y, LL z)
{
	if (x <= 0 || y <= 0 || z <= 0)
		return 1;
	if (x > 20 || y > 20 || z > 20)
	{
		x = 20, y = 20, z = 20;
		if (vis[x][y][z] == -1)
			vis[x][y][z] = w(20, 20, 20);
		return vis[x][y][z];
	}
	if (x < y && y < z)
	{
		if (vis[x][y][z] == -1)
			vis[x][y][z] = w(x, y, z - 1) + w(x, y - 1, z - 1) - w(x, y - 1, z);
		return vis[x][y][z];
	}
	else
	{
		if (vis[x][y][z] == -1)
			vis[x][y][z] = w(x - 1, y, z) + w(x - 1, y - 1, z) + w(x - 1, y, z - 1) - w(x - 1, y - 1, z - 1);
		return vis[x][y][z];
	} 
}

int main()
{
	memset(vis, -1, sizeof vis);
	while (cin >> a >> b >> c)
	{
		if (a == -1 && b == -1 && c == -1)
			break;
		cout << "w(" << a << ", " << b << ", " << c << ") = " << w(a, b, c) << endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值