对于一个递归函数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
老师告诉蒟蒻要用记忆化,但是蒟蒻一直 86,显示 2 个点 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;
}