P1464 [PacNW 1999] Function

P1464 [PacNW 1999] Function

题解

由于递归会多次调用导致超时,显然需要记忆化搜索,省去重复调用的过程,所以这里需要一个三维数组dp[25][25][25];

另外,本题数据很大,需要统一long long(每次涉及到这个都要调试好久)

ac✅️代码

#include<iostream>
using namespace std;

long long dp[21][21][21];

long long re(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 re(20 ,20 ,20);
	if(dp[a][b][c]) return dp[a][b][c];
	if( a < b && b < c)  dp[a][b][c] = re(a,b,c-1) + re(a,b-1, c-1) - re(a,b-1, c);
	else dp[a][b][c] = re(a-1,b,c) + re(a-1,b-1,c) + re(a-1,b,c-1) - re(a-1,b-1,c-1);
	
	return dp[a][b][c];
}

int main()
{
	long long a,b,c;
	while(1)
	{
		cin>>a>>b>>c;
		if(a == -1 && b == -1 && c == -1) return 0;
		printf("w(%lld, %lld, %lld) = %lld\n" , a,b,c,re(a,b,c));
		
	}
	return 0;
}
posted @ 2026-05-18 20:22  shuiwangrenjia  阅读(7)  评论(0)    收藏  举报