PKU 1579 Function Run Fun
問題:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1579
思路:
根據題意的描述,采用遞歸是顯然易見的
不過,該題的另一個突出的特點是重復子問題,如何既可以獲得遞歸的簡潔,又同時可以避免重復子問題的多次計算呢?
這時,就可以采用備忘錄方法
http://acm.pku.edu.cn/JudgeOnline/problem?id=1579
思路:
根據題意的描述,采用遞歸是顯然易見的
不過,該題的另一個突出的特點是重復子問題,如何既可以獲得遞歸的簡潔,又同時可以避免重復子問題的多次計算呢?
這時,就可以采用備忘錄方法
1 #define MAX 21
2 long table[MAX][MAX][MAX];
3
4 long
5 function_run_fun(int a, int b, int c)
6 {
7 if(a<=0 || b<=0 || c<=0)
8 return 1;
9 if(a>20 || b>20 || c>20)
10 return (table[20][20][20] = function_run_fun(20, 20, 20));
11
12 if(table[a][b][c] != 0) //memory search
13 return table[a][b][c];
14
15 else if(a<b && b<c)
16 table[a][b][c] = function_run_fun(a, b, c-1) + function_run_fun(a, b-1, c-1) - function_run_fun(a, b-1, c);
17 else
18 table[a][b][c] = function_run_fun(a-1, b, c) + function_run_fun(a-1, b-1, c) + function_run_fun(a-1, b, c-1) - function_run_fun(a-1, b-1, c-1);
19 return table[a][b][c];
20 }
2 long table[MAX][MAX][MAX];
3
4 long
5 function_run_fun(int a, int b, int c)
6 {
7 if(a<=0 || b<=0 || c<=0)
8 return 1;
9 if(a>20 || b>20 || c>20)
10 return (table[20][20][20] = function_run_fun(20, 20, 20));
11
12 if(table[a][b][c] != 0) //memory search
13 return table[a][b][c];
14
15 else if(a<b && b<c)
16 table[a][b][c] = function_run_fun(a, b, c-1) + function_run_fun(a, b-1, c-1) - function_run_fun(a, b-1, c);
17 else
18 table[a][b][c] = function_run_fun(a-1, b, c) + function_run_fun(a-1, b-1, c) + function_run_fun(a-1, b, c-1) - function_run_fun(a-1, b-1, c-1);
19 return table[a][b][c];
20 }
posted on 2010-06-29 22:52 simplyzhao 閱讀(205) 評論(0) 編輯 收藏 引用 所屬分類: C_動態規劃