zoukankan      html  css  js  c++  java
  • 记忆化搜索学习-洛谷P1464

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

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

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

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

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

    所以答案为1

    */

    输入输出格式

    输入格式:

    会有若干行。

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

    保证输入的数在 [-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

    感觉洛谷上面的一些算法题目真的挺好的,通过这些题目也可以学到不少东西,中文题意就不说了,虽然下面的说明里面有记忆化搜索,但是头铁的我在交了一发T之后老老实实回来了,记忆化搜索主要应用于dp和递归里面,有的时候需要大量的递归导致超时,这个时候我们可以把已经得到的结果保存下来方便计算,可以节省大量的时间。
    简单来说,打表,毕竟新手,代码也是模仿大佬的写的。。。
    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pb push_back
    #define fio ios::sync_with_stdio(false);cin.tie(0);
    #define pii pair<int,int>
    #define vi vector<int>
    #define vc vector<char>
    #define mii map<int,int>
    #define si(a) scanf("%d",&a)
    #define sl(a) scanf("%I64d",&a);
    #define slf(a) scanf("%lf",&a);
    #define pi acos(-1)
    
    const int INF=0x3f3f3f3f;
    const int N=2e5+5;
    
    typedef long long ll;
    typedef double db;
    typedef unsigned long long ull;
    using namespace std;
    
    ll record[50][50][50];
    
    ll w(ll a,ll b,ll c)
    {
        if(a<=0||b<=0||c <= 0)
        {
            return 1;
        }
        else if(a>20||b>20||c>20)
        {
            return w(20,20,20);
        }
        else if(record[a][b][c]==0)//如果这个点之前还没有到过,记录下来、
        {
            if(a < b && b < c)
            {
                record[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
            }
            else
            {
                record[a][b][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);
            }
            return record[a][b][c];
        }
    }
    
    int main()
    {
        ll a,b,c;
        while(cin>>a>>b>>c)
        {
            if(a==-1&&b==-1&&c==-1) break;
            printf("w(%lld, %lld, %lld) = %lld
    ",a,b,c,w(a,b,c));
        }
    }


  • 相关阅读:
    sqlplus时报Linux-x86_64 Error: 13: Permission denied
    thrift之TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 合并石子
  • 原文地址:https://www.cnblogs.com/TheSilverMoon/p/9341211.html
Copyright © 2011-2022 走看看