poj-1579 Function Run Fun
记忆化递归 思路来自于这里
注意一下输出的样式
普通思路:先判断简单的大于20和小于等于0,然后在依题意翻译成递归函数,但是这样会超时。
记忆化递归思路:
整个数组来记录每一次递归时的结果(要初始化为零)在原有的代码上添加一个判断来确认当前递归是否已经有记录的结果,如果有则直接返回当前数组。
剩下的其实相当于
if(x<y && y<z) dp[x][y][z]=bfs(x,y,z-1)+bfs(x,y-1,z-1)-bfs(x,y-1,z);
else dp[x][y][z]=bfs(x-1,y,z)+bfs(x-1,y-1,z)+bfs(x-1,y,z-1)-bfs(x-1,y-1,z-1);
return dp[x][y][z];
代码如下:(我怎么记得好像在lang11下放在外面的数组默认就是0来着)
#include <iostream>
#include <cstdio>
using namespace std;
long a[25][25][25] ={0};
int fun(int x, int y, int z);
int main()
{
int x,y,z;
while(cin >> x >> y >> z){
if(x == -1&&y == -1&&z == -1)
break;
printf("w(%d, %d, %d) = %d\n",x,y,z,fun(x,y,z));
}
return 0;
}
int fun(int x, int y,int z){
if(x <= 0 ||y <= 0 ||z <= 0)
return 1;
if(x > 20||y > 20||z > 20)
return fun(20,20,20);
if(a[x][y][z])
return a[x][y][z];
if(x < y&&y < z)
return a[x][y][z] = fun(x, y, z - 1) + fun(x, y - 1, z - 1) - fun(x, y - 1,z);
else
return a[x][y][z] = fun(x-1, y, z) + fun(x-1, y-1, z) + fun(x-1, y, z-1) - fun(x-1, y-1, z-1);
}
1.28补充:对于函数, if-return型语句相当于是“函数满足if条件后返回值并结束函数”
故“ if(a[x][y][z]) return a[x][y][z];” 不会和下面的语句冲突。