(记忆宏)Function问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45697774/article/details/102720979

(菜鸡的错题本)洛谷错题记录
这是我自己复习用的!
代码是我抄别人的!侵删(* /ω\*)
在这里插入图片描述
记忆宏

#define W_MEM(x,y,z) (w_mem[x][y][z] ? w_mem[x][y][z] : w_mem[x][y][z] = w(x, y, z))

意思就是W被求过,就返回W,否则将求得的值先赋给W然后返回。
减少求解次数,防止超时
递归+记忆+宏函数
直接定义一个记忆宏就行了

#include<bits/stdc++.h>
using namespace std;
#define W_MEM(x,y,z) (w_mem[x][y][z] ? w_mem[x][y][z] : w_mem[x][y][z] = w(x, y, z))
int a=1,b=1,c=1;
int w_mem[25][25][25];
int 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_MEM(20,20,20);
    if(a < b && b < c) return W_MEM(a,b,c-1)+W_MEM(a,b-1,c-1) - W_MEM(a,b-1,c);
    return W_MEM(a-1,b,c)+W_MEM(a-1,b-1,c)+W_MEM(a-1,b,c-1) - W_MEM(a-1,b-1,c-1);
}
int main(){
    while(1){
        cin>>a>>b>>c;
        if(a==-1 && b==-1 && c==-1) break;
        cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<w(a,b,c)<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45697774/article/details/102720979