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;
}

浙公网安备 33010602011771号