ACM入門演算法之 遞迴專場

2021-06-09 19:45:41 字數 1649 閱讀 2656

遞迴演算法就是在函式或子過程的內部,直接或者間接地呼叫自己的演算法,在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...