记忆化递归改
2024-12-18 13:56:09
发布于:北京
这道题目,所有的问题都局限在(0,0,0)到(20,20,20)之间,所以直接先递归填充表格,然后根据输入调用表格的值就行。
#include <bits/stdc++.h>
using namespace std;
long long num[50][50][50];
int w(long long a,long long b,long long c){
if(a <= 0 || b <= 0 || c<=0) return 1;
if(num[a][b][c]) return num[a][b][c];
if(a > 20 || b >20 || c > 20) return w(20,20,20);
if(a < b &&b < c) return w(a,b,c-1) +w(a,b-1,c-1)-w(a,b-1,c);
return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
}
int main(){
for(int i = 0;i <=20;i++){
for(int j = 0;j <=20;j++){
for(int x = 0;x <=20;x++){
num[i][j][x] = w(i,j,x);
}
}
}
long long a,b,c;
while(cin >>a >>b >>c){
if(a==-1 && b==-1 && c==-1){
return 0;
}
if(a <= 0 || b <= 0 || c<=0) printf("w(%lld, %lld, %lld) = 1\n",a,b,c);
else if(a > 20 || b >20 || c > 20) printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,num[20][20][20]);
else printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,num[a][b][c]);
}
return 0;
}
这里空空如也
有帮助,赞一个