您的位置:首页 > 其它

POJ-1579-Function Run Fun-递归,记忆化搜索

2011-02-11 21:34 465 查看
再次验证了在递归过程中,使用“记忆化搜索”很有利于提高效率。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: