题目意思看不懂那是不太可能的了。不过递归会tle倒有点可疑,因为discuss那里还是有人用递归过了的。
这是一道很简单的dp题,因为dp的方程已经给出并且状态转移方程也都写出了,所以根本没什么难度,就当作是认识一下dp吧,因为dp的形式有两种,一种是递推,另一种是递归,后者多用记忆化搜索来提高效率。
以下是代码:
- #include<cstdio>
using namespace std;
const int M=25;
int w[M][M][M];
int a,b,c; - void init()
{
int i,j,k;
for(i=0;i<=20;i++)
{
for(j=0;j<=20;j++)
{
for(k=0;k<=20;k++)
if(i<=0 || j<=0 || k<=0)
{
w[i][j][k]=1;
}
else if(i<j && j<k)
{
w[i][j][k]=w[i][j][k-1]+w[i][j-1][k-1]-w[i][j-1][k];
}
else
{
w[i][j][k]=w[i-1][j][k]+w[i-1][j-1][k]+w[i-1][j][k-1]-w[i-1][j-1][k-1];
}
}
}
} - int main()
{
init();
while(scanf("%d%d%d",&a,&b,&c)==3)
{
if(a==-1 && b==-1 && c==-1) break;
if(a<=0 || b<=0 || c<=0)
{
printf("w(%d, %d, %d) = %d/n",a,b,c,w[0][0][0]);
}
else if(a>20 || b>20 || c>20)
{
printf("w(%d, %d, %d) = %d/n",a,b,c,w[20][20][20]);
}
else
{
printf("w(%d, %d, %d) = %d/n",a,b,c,w[a][b][c]);
}
}
return 0;
}