题解
2024-05-18 10:24:06
发布于:上海
53阅读
0回复
0点赞
这道题题目给了提示:输入数据非常大,因此用long long,而w(15,15,15)计算次数非常多,所以可以记忆化搜索,开三维数组long long value[50][50][50]
来存储。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long value[50][50][50]={};
long long w(long long a,long long b,long long c){
if(a<=0||b<=0||c<=0)return 1;
if(a>20||b>20||c>20)return w(20,20,20);
if(value[a][b][c]!=-1)return value[a][b][c];//记忆化搜索
if(a<b&&b<c)return value[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
return value[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);
}
int main(){
long long a,b,c;
memset(value,-1,sizeof(value));
while(cin>>a>>b>>c){
if(a==-1&&b==-1&&c==-1)break;
printf("w(%lld,%lld,%lld) =%lld\n",a,b,c,w(a,b,c));
}
return 0;
}
PS,题目给的输出样例格式有问题,按照那个格式输出会PE
这里空空如也
有帮助,赞一个