您的位置:首页 > 其它

POJ 1579 Function Run Fun

2014-03-09 11:05 337 查看
原题地址:http://poj.org/problem?id=1579

题目大意:给你一个递归式,计算给定数字的值。如果直接实现的话,会TLE.

这个题目我刚看的的时候,把题目描述中的"if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 


if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: 
w(20, 20, 20) "的or硬是想成了and,以至于没有思路。看了一下别人的题解,才知道。但在实现的时候,应该是打表,又写成了递归调用函数。。。

思路:简单的动态规划,直接打表,开一个三维数组,将(0,0,0)~(20,20,20)间的数都打在表中,就OK了

#include
#include

int arr[30][30][30];//开一个三维数组,用来打表
//函数w用来给定三维数组下标得到该元素的值
int w(int a,int b,int c)
{
if((a <= 0)||(b <= 0)||(c <= 0))
return 1;
if((a < b)&&(b < c))
return arr[a][b][c-1]+arr[a][b-1][c-1]-arr[a][b-1][c];
return arr[a-1][b][c] + arr[a-1][b-1][c] + arr[a-1][b][c-1] - arr[a-1][b-1][c-1];
}

int main()
{
int i,j,k;
int x,y,z;//保存输入的三个数字
for(i = 0;i < 21;i++)//三层for循环,打表
{
for(j = 0;j < 21;j++)
{
for(k = 0;k < 21;k++)
{
arr[i][j][k] = w(i,j,k);
}
}
}
while(scanf("%d%d%d",&x,&y,&z) != EOF)
{
if(x == -1 && y == -1 && z == -1)
break;
if(x < 0 || y < 0 || z < 0)
printf("w(%d, %d, %d) = %d\n",x,y,z,arr[0][0][0]);
else if(x > 20 || y > 20 || z > 20)
printf("w(%d, %d, %d) = %d\n",x,y,z,arr[20][20][20]);
else printf("w(%d, %d, %d) = %d\n",x,y,z,arr[x][y][z]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm poj 动态规划 递归 c