美文网首页
codevs 1910 递归函数

codevs 1910 递归函数

作者: 科学旅行者 | 来源:发表于2016-07-24 10:35 被阅读237次

题目:

题目描述 Description
对于一个递归函数w(a, b, c)。
如果a <= 0 or b <= 0 or c <= 0就返回值1。
如果a > 20 or b > 20 or c > 20就返回W(20,20,20)。
如果a < b并且b < c 就返回w(a, b, c − 1) + w(a, b − 1, c − 1) − w(a, b − 1, c),
其它别的情况就返回w(a − 1, b, c) + w(a − 1, b − 1, c) + w(a − 1, b, c − 1) − w(a −1, b - 1, c - 1)
这是个简单的递归函数,但实现起来可能会有些问题。
输入描述 Input Description
会有若干行.每行三个数,表示a, b, c。并以−1, −1, −1结束
输出描述 Output Description
输出若干行,注意各种中的空格。
样例输入 Sample Input
1 1 1
2 2 2
-1 -1 -1
样例输出 Sample Output
w(1, 1, 1) = 2
w(2, 2, 2) = 4
数据范围及提示 Data Size & Hint
a, b, c < 30, Task < 11

这道题给了递归函数,但是直接递归肯定超时(题目只给1s)。
此题可以在递归的过程中使用记忆化搜索,将已经求到的值存入一个数组,下一次到这里可以直接使用此数据而无需递归,减少递归次数。
注意:此题的a,b,c可能会小于0.

参考代码:

#include <iostream>
using namespace std;
int dp[35][35][35];
int w(int a,int b,int c) {
    if (a <= 0 || b <= 0 || c <= 0) {
        return 1;
    }
    else if (a > 20 || b > 20 || c > 20) {
        if (dp[a][b][c] == -100)
            dp[a][b][c] = w(20,20,20);
        return dp[a][b][c];
    }
    else if (a < b && b < c) {
        if (dp[a][b][c-1] == -100)
            dp[a][b][c-1] = w(a,b,c-1);
        if (dp[a][b-1][c-1] == -100)
            dp[a][b-1][c-1] = w(a,b-1,c-1);
        if (dp[a][b-1][c] == -100)
            dp[a][b-1][c] = w(a,b-1,c);
        return (dp[a][b][c-1]+dp[a][b-1][c-1]-dp[a][b-1][c]);
    }
    else {
        if (dp[a-1][b][c] == -100)
            dp[a-1][b][c] = w(a-1,b,c);
        if (dp[a-1][b-1][c] == -100)
            dp[a-1][b-1][c] = w(a-1,b-1,c);
        if (dp[a-1][b][c-1] == -100)
        dp[a-1][b][c-1] = w(a-1,b,c-1);
        if (dp[a-1][b-1][c-1] == -100)
            dp[a-1][b-1][c-1] = w(a-1,b-1,c-1);
        return (dp[a-1][b][c]+dp[a-1][b-1][c]+dp[a-1][b][c-1]-
                dp[a-1][b-1][c-1]);
    }
}
int main() {
    int a,b,c;
    for (int i = 0;i < 35;++i) {
        for (int j = 0;j < 35;j++) {
            for (int k = 0;k < 35;k++) {
                dp[i][j][k] = -100;
            }
        }
    }
    while (cin >> a >> b >> c) {
        if (a == -1 && b == -1 && c == -1) break;
        int res = w(a,b,c);
        cout << "w" << "(" << a << ", " << b << ", " << c << ")" << " = " << res << endl;
    }
    return 0;
}

相关文章

  • codevs 1910 递归函数

    题目: 题目描述 Description对于一个递归函数w(a, b, c)。如果a <= 0 or b <= 0...

  • 二路归并排序(递归)

    归并排序(递归) http://codevs.cn/problem/1076/超出空间了 2-路归并排序将R[lo...

  • Day10递归函数、模块、迭代器、生成器

    一、递归函数 1、什么是递归函数 在函数中调用函数本身的函数就是递归函数。 2、递归的作用 循环能做的递归都能做 ...

  • day11 函数(3)

    递归函数 实际开发的时候,能不用递归就不用 什么是递归函数 函数中调用函数本身的函数就是递归函数 递归的作用: 循...

  • python 递归函数

    递归函数 递归函数 : 在函数的调用自身 递归边界 : 退出递归的终止条件 例1,函数func如果没有设备递归边界...

  • day11-日常(递归函数、模块、迭代器、生成器)

    递归函数(实际开发的时候,能不用递归就不用) 1.什么是递归函数 函数中调用函数本身的函数就是递归函数 2.递归的...

  • 2019-01-07day11学习总结

    递归函数 实际开发的时候能不用递归就不用递归 1. 什么是递归函数 函数中调用函数本身的函数就是递归函数 2. 递...

  • 递归函数、模块、生成器、迭代器

    一、递归函数 实际开发的时候,能不用递归就不用 1.什么是递归函数 函数中调用函数本身的函数就是递归函数 2.递归...

  • day 11总结

    递归函数 实际开发的时候,能不用递归就不用1.什么是递归函数函数中调用函数本身的函数就是递归函数 2.递归的作用:...

  • Day11笔记

    实际开发的时候,能不用递归就不用 递归函数 1.什么是递归函数函数中调用函数本身的函数就是递归函数 2.递归的作用...

网友评论

      本文标题:codevs 1910 递归函数

      本文链接:https://www.haomeiwen.com/subject/ctnwjttx.html