zoukankan      html  css  js  c++  java
  • 洛谷P1464 Function(记忆化)

    题目描述

    对于一个递归函数w(a,b,c)w(a,b,c)w(a,b,c)

    • 如果a≤0a le 0a0 or b≤0b le 0b0 or c≤0c le 0c0就返回值111.
    • 如果a>20a>20a>20 or b>20b>20b>20 or c>20c>20c>20就返回w(20,20,20)w(20,20,20)w(20,20,20)
    • 如果a<ba<ba<b并且b<cb<cb<c 就返回w(a,b,c−1)+w(a,b−1,c−1)−w(a,b−1,c)w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)w(a,b,c1)+w(a,b1,c1)w(a,b1,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)w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)w(a1,b,c)+w(a1,b1,c)+w(a1,b,c1)w(a1,b1,c1)

    这是个简单的递归函数,但实现起来可能会有些问题。当a,b,ca,b,ca,b,c均为15时,调用的次数将非常的多。你要想个办法才行.

    /* absi2011 : 比如 w(30,−1,0)w(30,-1,0)w(30,1,0)既满足条件1又满足条件2

    这种时候我们就按最上面的条件来算

    所以答案为1

    */

    输入格式

    会有若干行。

    并以−1,−1,−1-1,-1,-11,1,1结束。

    保证输入的数在[−9223372036854775808,9223372036854775807][-9223372036854775808,9223372036854775807][9223372036854775808,9223372036854775807]之间,并且是整数。

    输出格式

    输出若干行,每一行格式:

    w(a, b, c) = ans

    注意空格。

    输入输出样例

    输入 #1
    1 1 1
    2 2 2
    -1 -1 -1
    输出 #1
    w(1, 1, 1) = 2
    w(2, 2, 2) = 4
    提示赤裸裸地告诉了要用记忆化...用一个三维数组存放已经搜出来的值即可。
    #include <bits/stdc++.h>
    using namespace std;
    long long m[23][23][23]={-1};
    long long w(int a,int b,int c)
    {
        if(a<=0||b<=0||c<=0)return 1;
        if(a>20||b>20||c>20)return w(20,20,20);
        if(m[a][b][c]!=-1)return m[a][b][c];
        if(a<b&&b<c)
        {
            int x,y,z;
            x=w(a,b,c-1);
            y=w(a,b-1,c-1);
            z=-w(a,b-1,c);
            m[a][b][c]=x+y+z;
            return m[a][b][c];
        }
        int x,y,z,p;
        x=w(a-1,b,c);
        y=w(a-1,b-1,c);
        z=w(a-1,b,c-1);
        p=-w(a-1,b-1,c-1);
        m[a][b][c]=x+y+z+p;
        return m[a][b][c];
    }
    int main()
    {
        unsigned long long a,b,c;
        int i,j,k;
        for(i=0;i<=22;i++)
        {
            for(j=0;j<=22;j++)
            {
                for(k=0;k<=22;k++)m[i][j][k]=-1;
            }
        }
        while(scanf("%lld%lld%lld",&a,&b,&c))
        {
            if(a==-1&&b==-1&&c==-1)break;
            printf("w(%lld, %lld, %lld) = %lld
    ",a,b,c,w(a,b,c));
        }
        return 0;
    }
  • 相关阅读:
    DB2 for Z/os Statement prepare
    Foreign key (referential) constraints on DB2 LUW v105
    复制Informational constraints on LUW DB2 v105
    DB2 SQL Mixed data in character strings
    DB2 create partitioned table
    MVC中使用EF的技巧集(一)
    Asp.Net MVC 开发技巧(二)
    Linq使用技巧及查询示例(一)
    Asp.Net MVC 开发技巧(一)
    Asp.Net MVC Identity 2.2.1 使用技巧(八)
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/12494243.html
Copyright © 2011-2022 走看看