因為要準備複試機試就每天刷兩道題
大家應該對遞迴不陌生,有很多問題使用遞迴解決會又方便又簡潔。
我們現在定義這樣乙個遞迴函式w(a, b, c):
如果 a <= 0 或 b <= 0 或 c <= 0, 那麼 w(a, b, c) 的值為1
如果 a > 20 或 b > 20 或 c > 20, 則 w(a, b, c) 的值為:
w(20, 20, 20)
如果 a < b 並且 b < c, 此時 w(a, b, c) 的值等於:
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
其它情況下w(a, b, c)的值為:
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
形式上這個函式不難實現,但是如果我們直接這樣定義遞迴函式,對於並不那麼大的a,b,c(比如a=b=c=15)來說,程式都有可能要執行數個小時,因為這個遞迴收斂太慢,運算所需要的計算量太大了!現在希望你來做點什麼,快速計算出指定變數a,b,c的函式值.
input
輸入有多行,每行是由空格分隔的三個整數a,b,c,最後一行是 -1,-1,-1表示輸入的結束,這一行不需要處理。
output
除最後一行之外,對輸入資料的每一行的a,b,c分別計算並按樣例中的格式輸出w(a,b,c)的值
sample input
111
22210
46505050-
1718-
1-1-
1
sample output
w(1
,1,1
)=2w
(2,2
,2)=
4w(10
,4,6
)=523w(50
,50,50
)=1048576w(
-1,7
,18)=
1
#include
intmain()
}}while
(scanf
("%d%d%d"
,&a,
&b,&c)
&&(a!=-1
||b!=-1
||c!=-1
))return0;
}
#include
#include
#define maxn 21
int bw[maxn]
[maxn]
[maxn]
;intw(
int a,
int b,
int c)
if(a>
20|| b>
20|| c>20)
if(bw[a]
[b][c]!=0
)else
else
return bw[a]
[b][c];}
}int
main
(void
)printf
("w(%d, %d, %d) = %d\n"
,a,b,c,
w(a,b,c));
}return0;
}
類似於動態規劃,我們需要儲存已經計算過的w的值,按照題目給出的順序計算就沒有問題。 2019 年華東師範大學機試
沒有經過資料的檢驗,如果有錯誤歡迎指正 找規律後可以找到這個。固定任意一條邊 我這裡用了最大 然後二分角度 include using namespace std typedef long long ll const ll inf 0x3f3f3f3f const double eps 1e 9 c...
華東師範計算機專碩考研經驗
除了政治和數學其他的考的都還不錯,所以覺得寫一下還是比較有意義的。最重要的我覺得是不要買太多書!買多了就是浪費錢!另外每個人有每個人的學習方法,還是應該多看別人的經驗自己總結。我數學不好,所以就大概說一下。數學做題不在於多,我做了1000題和660,其實都差不多,都是源自真題,所以只要把1800或1...
華東師範大學2020機試題解
1.統計卡牌的值 2.求30的倍數 include include include include include using namespace std const int maxn 1000 10 int arr maxn bool compare char x,char y intmain i...