• codevs1910 递归函数


    难度等级:黄金
    codevs1910 递归函数
    题目描述 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

    这是一道裸的递归转记忆化搜索的问题。

    设一个三维数组f[a][b][c],表示w(a,b,c)相应的值。在每次递归之前判断f[a][b][c]是否已经算过一次,若算过直接加上f[a][b][c]的值;若没有算过,则加上递归w(a,b,c)的值,同时把递归结果赋值给f[a][b][c].

    本题特别注意输出格式,数字与数字之间有空格,等号与数字之间也有空格。以样例为例:w(1,空格1,空格1)空格=空格2

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int aa,bb,cc;
    int f[31][31][31];
    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(f[20][20][20]) return f[20][20][20];
             else return w(20,20,20);
         }
        else if(a<b&&b<c) 
        {
            int s=0;
            if(!f[a][b][c-1]) f[a][b][c-1]=w(a,b,c-1);
            s+=f[a][b][c-1];
            if(!f[a][b-1][c-1]) f[a][b-1][c-1]=w(a,b-1,c-1);
            s+=f[a][b-1][c-1];
            if(!f[a][b-1][c]) f[a][b-1][c]=w(a,b-1,c);
            s-=f[a][b-1][c];
            return s;
        }
        else 
        {
            int s=0;
            if(!f[a-1][b][c]) f[a-1][b][c]=w(a-1,b,c);
            s+=f[a-1][b][c];
            if(!f[a-1][b-1][c]) f[a-1][b-1][c]=w(a-1,b-1,c);
            s+=f[a-1][b-1][c];
            if(!f[a-1][b][c-1]) f[a-1][b][c-1]=w(a-1,b,c-1);
            s+=f[a-1][b][c-1];
            if(!f[a-1][b-1][c-1]) f[a-1][b-1][c-1]=w(a-1,b-1,c-1);
            s-=f[a-1][b-1][c-1];
            return s;
        }
    }
    int main()
    {
        while(cin>>aa>>bb>>cc)
        {
            if(aa==-1&&bb==-1&&cc==-1) return 0;
            printf("w(%d, %d, %d) = %d
    ",aa,bb,cc,w(aa,bb,cc));
        }
    }
  • 相关阅读:
    c++ 编译时检测结构体大小的的宏定义写法
    文本格式转换的网站,云转换
    chm格式文件,win7下用c:/windows/hh.exe打开
    visual paradigm 自动解析代码生成 UML图
    proxifiler 代理神器
    linux下设置 git ssh 代理
    一直出现 Enter passphrase for key '/root/.ssh/gitkey12.pub'
    connect-proxy rpm文件的安装
    [转] ssh免密码登录服务器
    [转] 公司局域网中代码访问 github.com
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6159741.html
Copyright © 2020-2023  润新知