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