记忆化搜索

记忆化搜索就是把我们曾经递归过的函数中给记录下来该函数是否递归过,然后把他的值存下来,这样我们如果递归到同样的函数时,只要返回之前递归过的值即可,这样可以少很多递归过程。
这里以vijos中的P1080为代表。题目地址:https://vijos.org/p/1080
然后上代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int MAXN=30;
int f[MAXN][MAXN][MAXN];
bool v[MAXN][MAXN][MAXN];
int a,b,c;

int dfs(int x,int y,int z)
{
    if(x<=0||y<=0||z<=0)
        return 1;
    if(x>20||y>20||z>20)
        return dfs(20,20,20);
    if(v[x][y][z])
        return f[x][y][z];
    v[x][y][z]=1;
    if(a<b&&b<c)
        return f[x][y][z]=dfs(x,y,z-1)+dfs(x,y-1,z-1)+dfs(x,y-1,z);
    else
        return f[x][y][z]=dfs(x-1,y,z)+dfs(x-1,y-1,z)+dfs(x-1,y,z-1)-dfs(x-1,y-1,z-1);
}

int main()
{

    //输出到文件
    //freopen ("output.txt","r",stdout);

    while(cin>>a>>b>>c)
    {
        if(a==-1&&b==-1&&c==-1)
            break;
        else
            printf("w(%d, %d, %d) = %d\n",a,b,c,dfs(a,b,c));
    }
}
     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值