遞迴策略(減而治之和分而治之)

2021-08-02 12:51:00 字數 1154 閱讀 3786

遞迴演算法是把問題轉化為規模縮小了的同類問題的子問題。然後遞迴呼叫函式(或過程)來表示問題的解。

接下來,我們將通過同乙個問題來分析兩種策略。

問題: 計算任意n個整數之和

求解乙個大規模的問題,可以將其劃分為兩個子問題,其一是平凡問題,另乙個規模縮減。由子問題的解,得到原問題的解。

int sum(int a, int n)

求解乙個大規模的問題,可以將其劃分為多個(通常情況下為兩個)子問題,兩個問題的規模大體相同。由子問題的解,得到原問題的解。

int sum(int a, int low, int high)

通過以上例子可以明顯感覺到減而治之和分而治之的演算法差別,接下來將通過乙個例子進一步說明分而治之演算法的優越性。

找出陣列中最大的兩個數a[low,high)

通常情況下,最直接也是最容易想到的方法是,將陣列中數遍歷一遍。具體的**如下:

void max2(int a, int low, int high, int &first, int &second)

}}

如果用分而治之的方法求解,**如下:

void max2_recursion(int a, int low, int high, int &first, int &second)

else

return;

}if (low + 3 == high)

}int mid = (low + high) >> 1;

int first_left, second_left, first_right,second_right;

max2_recursion(a, low, mid, first_left, second_left);

max2_recursion(a, mid, high, first_right, second_right);

if (a[first_left] > a[first_right])

else

}

由以上**可以看出,分而治之的方法時間複雜度雖然還是o(n),但是明顯更為簡便。

L2 1 分而治之

輸入在第一行給出兩個正整數 n 和 m 均不超過10 000 分別為敵方城市個數 於是預設城市從 1 到 n 編號 和連線兩城市的通路條數。隨後 m 行,每行給出一條通路所連線的兩個城市的編號,其間以乙個空格分隔。在城市資訊之後給出參謀部的系列方案,即乙個正整數 k 100 和隨後的 k 行方案,每...

L2 025 分而治之

problem description 分而治之,各個擊破是兵家常用的策略之一。在戰爭中,我們希望首先攻下敵方的部分城市,使其剩餘的城市變成孤立無援,然後再分頭各個擊破。為此參謀部提供了若干打擊方案。本題就請你編寫程式,判斷每個方案的可行性。input 輸入在第一行給出兩個正整數 n 和 m 均不超...

PAT L2 025 分而治之

利用標記陣列對各個城市進行操作,利用結構體儲存城市之間的關係,最後進行簡單判斷即可。比賽的時候太著急,思路混亂,用並查集怎麼做都 心態都崩了。分而治之,各個擊破是兵家常用的策略之一。在戰爭中,我們希望首先攻下敵方的部分城市,使其剩餘的城市變成孤立無援,然後再分頭各個擊破。為此參謀部提供了若干打擊方案...