遞歸的函數

遞歸的函數
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss
Problem Description

給定一個函數 f(a, b, c):
如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值爲 1;
如果 a > 20 或 b > 20 或 c > 20 返回值爲 f(20, 20, 20);
如果 a < b 並且 b < c 返回 f(a, b, c−1) + f(a, b−1, c−1) − f(a, b−1, c);
其它情況返回 f(a−1, b, c) + f(a−1, b−1, c) + f(a−1, b, c−1) − f(a-1, b-1, c-1)。
看起來簡單的一個函數?你能做對嗎?
Input

輸入包含多組測試數據,對於每組測試數據:
輸入只有一行爲 3 個整數a, b, c(a, b, c < 30)。
Output

對於每組測試數據,輸出函數的計算結果。
Example Input

1 1 1
2 2 2
Example Output

2
4

answer

int as[41][41][41];

int f(int a,int b,int c)
{

if(a<=0||b<=0||c<=0)
    return 1;
if(as[a][b][c]>0)
    return as[a][b][c];
else
{
    if (a>20||b>20||c>20)
     f(20,20,20);
 else if(a<b&&b<c)
    return as[a][b][c]=f(a, b, c-1) + f(a, b-1, c-1) -f(a, b-1, c);
else
     return  as[a][b][c]=f(a-1,b,c)+f(a-1,b,c-1)+f(a-1,b-1,c)-f(a-1,b-1,c-1);

}

}
int main()
{
memset(as,-1,sizeof(as));
int a,b,c,q;

while (scanf("%d %d %d",&a,&b,&c)!=EOF)
{
    q=f(a,b,c);
    printf("%d\n",q);
}
return 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章