遞迴演算法就是在函式或子過程的內部,直接或者間接地呼叫自己的演算法,在acm中它是乙個入門級的演算法,題目一般非常簡單。它一般解決三類問題:
(1) 資料的定義是按遞迴定義的。(fibonacci函式)
(2) 問題解法按遞迴演算法實現。(回溯)
(3) 資料的結構形式是按遞迴定義的。(樹的遍歷,圖的搜尋)
遞迴演算法解決問題的特點:
(1) 遞迴就是在過程或函式裡呼叫自身。
(2) 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,稱為遞迴出口。
(3) 遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低,並且在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等。所以一般不提倡用遞迴演算法設計程式
遞迴是非常工具性的演算法,常用於其他演算法的實現,例如遞迴常與分治演算法一同出現,也在深搜,遞迴建樹,樹的遞迴遍歷等等地方使用,在很多的模擬題中也有很大的作用,往往使得**變得十分清晰和精短。
同時acm中遞迴的題目也相對簡單以下是我做過的一些簡單題的總結。
下面hdoj 2044 到 hdoj 2050是很好的入門級別的遞迴練習,當然,有的題還是很有難度。
2044
乙隻小蜜蜂...
36.87%(8238/22344)
hdoj 2044
解題思路:
1)每到乙個點的路徑數肯定等於它左邊和左下方(左上方)的路徑之和。
2)設從a走到
b之間一共走
n步,則有:
dp[n]=dp[n-1]+dp[n-2]; dp[n-1]=dp[n-2]+dp[n-3]..............
貼下**:
#include #include #include using namespace std;
long long a[55];
int t,n,m;
int main()
cin >> t;
while (t--)
return 0;
}
hdoj 2045/2046/2047/2048/2049差不多都是一樣的思想,大家就慢慢推理吧。
重點說說 hdoj2050:
這題當初我也是cp的,大家可以參考:
解題思路:
主要是用到遞推即可。遞推過程:首先分析直線分平面最多多少份:
f(1)=2;f(2)=4;f(3)=7;f(4)=
11……可知f(n)=f(n-1)+n且f(1)=2.
可知f(n)=(1+n)
*n/2+1;
同理,可將每個折線看成是兩條直線,但是少
了一半。因此每一條折線比兩
條直線分割的面的部分少2。因此n條折線比2n條直線分割平面形成的部分少2n。
所以f(n)=2*n^2-n+1;
cp的**:
#includeusing namespace std;
int main()
{ int n;
cin>>n;
while(n)
{ int m;
cin>>m;
int sum=2*m*m-m+1;
cout<
ACM演算法入門
oj上的一些水題 可用來練手和增加自信 poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094 初期 一.基本演算法 1 列舉.poj1753,poj2965 2 貪心 poj1328,poj2109,poj25...
acm之遞迴題目7
hdu 2006 10 acm contest的頒獎晚會隆重開始了!為了活躍氣氛,組織者舉行了乙個別開生面 獎品豐厚的 活動,這個活動的具體要求是這樣的 首先,所有參加晚會的人員都將一張寫有自己名字的字條放入 箱中 然後,待所有字條加入完畢,每人從箱中取乙個字條 最後,如果取得的字條上寫的就是自己的...
入門推薦 ACM之輸入
輸入 第一類 輸入不說明有多少個input block,以eof為結束標誌。例1 description 你的任務是計算a b input 輸入包含多行資料,每行有兩個整數a和b,以空格分開。output 對於每對整數a,b,輸出他們的和,每個和佔一行。sample input 1 510 20 s...