求助站外题
  • 板块学术版
  • 楼主__bjxx0201__
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/7/6 12:12
  • 上次更新2024/7/6 15:12:27
查看原帖
求助站外题
1065753
__bjxx0201__楼主2024/7/6 12:12

题目描述

对于一个递归函数w(a,b,c)

如果a< =0 或者 b< =0 或者 c< =0就返回值1

如果a> 20 或者 b> 20 或者 c> 20就返回w(20,20,20)

如果a< b并且b< c 就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,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)

输入描述

会有若干行. 并以-1,-1,-1结束

输出描述

输出若干行

样例输入

1 1 1
2 2 2
-1 -1 -1

样例输出

w(1,1,1)=2
w(2,2,2)=4

老师告诉蒟蒻要用记忆化,但是蒟蒻一直 8686,显示 22 个点 Runtime Error,求助大佬,代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
bool flag[52][52][52];
int vis[52][52][52];
int w (int a,int b,int c) {
	if (flag[a][b][c]==1) return vis[a][b][c];
	if (a<=0 || b<=0 || c<=0) {
		flag[a][b][c]=1;
		vis[a][b][c]=1;
		return vis[a][b][c];
	}
	else if (a>20 || b>20 || c>20) {
		flag[a][b][c]=1;
		vis[a][b][c]=w (20,20,20);
		return vis[a][b][c];
	}
	else if (a<b && b<c) {
		flag[a][b][c]=1;
		vis[a][b][c]=w (a,b,c-1)+w (a,b-1,c-1)-w (a,b-1,c);
		return vis[a][b][c];
	}
	else {
		flag[a][b][c]=1;
		vis[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);
		return vis[a][b][c];
	}
}
inline int read () {int s=0,w=0;char c=getchar ();while (!isdigit (c)){w|=(c=='-');c=getchar ();}while (isdigit (c)) {s=(s<<1)+(s<<3)+(c^48);c=getchar ();}return w?-s:s;}
inline void write (int x) {if (x<0) putchar ('-'),x=-x;if (x>9) write (x/10);putchar (x%10|48);}
signed main() {
    while (1) {
    	int a,b,c;
    	a=read (),b=read (),c=read ();
    	if (a==-1 && b==-1 && c==-1) break;
    	if (a<=0 || b<=0 || c<=0) 
    		cout<<"w("<<a<<","<<b<<","<<c<<")=1";
    	else cout<<"w("<<a<<","<<b<<","<<c<<")="<<w (a,b,c);
    	cout<<"\n"; 
	}
	return 0;
}
2024/7/6 12:12
加载中...