0分dalao求助!!!
查看原帖
0分dalao求助!!!
959579
xiaobu_dean楼主2023/12/1 21:51

// 思路:先尝试暴力递归!!!,不行 // 加记忆化搜索 // 当a>20||b>20||c>20时,结果相同,我们就令它们为21,这样数组就能存下了

#include <bits/stdc++.h>
using namespace std;

using ll = long long ;
const int N = 1e5 + 50;
ll f[25][25][25];
ll w(ll a,ll b,ll c) {
	if (a<=0||b<=0||c<=0) return 1;
	else if (f[a][b][c]!=0) return f[a][b][c];
	else if (a>20||b>20||c>20) f[a][b][c] = w(20,20,20);
	else if (a<b&&b<c) f[a][b][c] = w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
	else f[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 f[a][b][c];
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
    ll a,b,c;
    while (1) {
    	memset(f,0,sizeof f);
    	cin >> a >> b >> c;
    	if (a == b && b == c && a == -1) break;
    	if (a>20) a=21;
    	if (b>20) b=21;
    	if (c>20) c=21;
    	cout << "w(" << a << ", " << b << ", " << c << ")" << " = " <<  w(a,b,c) << '\n';
    }
	return 0;
}
2023/12/1 21:51
加载中...