再次验证了在递归过程中,使用“记忆化搜索”很有利于提高效率。
POJ上“记忆化搜索”的讲解另参见:
POJ-1088-滑雪-解题报告-动态规划-记忆化搜索
#include <iostream> using namespace std; const int MAX_SIZE = 21; //按照题意,用一个三维数组存储结果时,最大时用到result[20][20][20]即可 int result[MAX_SIZE][MAX_SIZE][MAX_SIZE]; //保存计算结果的全局数组 int fun(int a, int b, int c) { if(a <= 0 || b <= 0 || c <= 0) return 1; /*由于result数组各维大小只开到21,故这个判断分支要放在前面。此处直接返回result[20][20][20]是可行的,因为已经在主函数中先计算出了其值*/ if(a > 20 || b > 20 || c > 20) return result[20][20][20]; /*记忆化搜索*/ if(result[a][b][c] > 0) return result[a][b][c]; /*求得结果并保存*/ if(a < b && b < c) return result[a][b][c] = fun(a, b, c-1) + fun(a, b-1, c-1) - fun(a, b-1, c); /*求得结果并保存*/ return result[a][b][c] = fun(a-1, b, c) + fun(a-1, b-1, c) + fun(a-1, b, c-1) - fun(a-1, b-1, c-1); } int main() { fun(20, 20, 20); //先求出w(20, 20, 20) int a, b, c; while(cin >> a >> b >> c, !(a == -1 && b == -1 && c == -1)) { int output = fun(a, b, c); cout << "w(" << a << ", " << b << ", " << c << ") = " << output << endl; } return 0; }