洛谷 P1464 Function(dfs+记忆化搜索)

https://www.luogu.com.cn/problem/P1464

  1. 单个返回条件的时候,直接return
  2. 多个返回条件的时候,采用记忆化搜索思想,边存储边继续往下搜索
  3. 中间穿插记忆化判断,如果之前有过此类记录,直接拿来用,没有的话就继续往下搜索
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=500200,M=202;
int mp[M][M][M];
LL dfs(LL x,LL y,LL z)
{
    if(x<=0||y<=0||z<=0) return 1;
    if(x>20||y>20||z>20) return dfs(20,20,20);
    if(mp[x][y][z]) return mp[x][y][z];
    if(x<y&&y<z) return mp[x][y][z]=dfs(x,y,z-1)+dfs(x,y-1,z-1)-dfs(x,y-1,z);
    else return mp[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()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    //init();
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL x,y,z;
        while(cin>>x>>y>>z)
        {
            if(x==-1&&y==-1&&z==-1) break;
            cout<<"w("<<x<<", "<<y<<", "<<z<<") = "<<dfs(x,y,z)<<endl;
        }
    }
    return 0;
}
posted @ 2022-10-31 21:31  Vijurria  阅读(26)  评论(0编辑  收藏  举报