對於乙個待求解的問題,我們由已知的某個小問題進而一步一步推向該問題的方法稱為遞推
遞迴正好與遞推的方向相反,它是由大問題逐步分解為小問題,然後回溯到大問題進行解決的方法。
列舉形式
狀態空間規模
一般遍歷方式
多項式nk,k為常數
迴圈、遞推
指數kn,k為常數
遞迴、位運算
排列n!
遞迴、c++ next_permutation
組合$\binom$
遞迴+剪枝
把乙個問題分解成若干個規模更小的同類子問題,對這些子問題求解,然後在回溯時通過他們推導出原問題的解。
可以通過維護乙個棧,將呼叫函式和返回函式的壓棧出棧過程進行模擬,從而將遞迴實現迴圈。
1. 0301 遞迴實現指數型列舉
#include#includeusing namespace std;vectorans;
int n, flag;
void dfs(int dep, int idx)
2. 0302 遞迴/非遞迴實現組合型列舉
//遞迴型#include#includeusing namespace std;
vectorans;
int n, m;
void dfs(int x)
//遞推型
#include#includeusing namespace std;
struct info;
int n, m;
dequest;
int main()});
while(st.size())
}if(t.t.size() == m)
4. 0201 費解的開關
#include#includeusing namespace std;
//#define _debug
int n;
vectorrecord;
const int dx = , dy = ;
void change(int x, int y, vector& s)
void set_bit(int x, int y, vector& t)
}}int get_res()
int step = get_res();
if(step <= 6) cout<5. poj1958 strange towers of hanoi
#include#includeusing namespace std;
const int n = 20;
int dp3[n], dp4[n];
int main(){
memset(dp3, 0x3f, sizeof dp3), memset(dp4, 0x3f, sizeof dp4);
dp3[0] = 0, dp4[0] = 0;
for(int i = 1; i < 13; ++i) dp3[i] = dp3[i - 1] * 2 + 1;
for(int i = 1; i < 13; ++i)
for(int j = 0; j <= i; ++j)
dp4[i] = min(dp4[i], dp4[j] * 2 + dp3[i - j]);
for(int i = 1; i < 13; ++i)
cout<6. poj1845 sumdiv
遞推與遞迴
遞推與遞迴 遞推像是多公尺諾骨牌,遞迴是大事化小。遞推的效率更高 遞推 斐波那契數列 例 母親為兒子的四年大學學費準備了一筆存款,兒子每月月底取下月生活費1000元。銀行年利率為 1.71 畢業時連本帶息要取出 1000 元。則要存入多少錢。include define rate 0.0171 in...
遞推與遞迴
遞迴 將問題規模為n的問題,降解成若干個規模為n 1的問題,依次降解,直到問題規模可求,求出低階規模的解,代入高階問題中,直至求出規模為n的問題的解。遞推 構造低階的規模 如規模為i,一般i 0 的問題,並求出解,推導出問題規模為i 1的問題以及解,依次推到規模為n的問題。遞迴包括回溯和遞推兩個過程...
遞迴與遞推
1 遞迴與遞推的定義 前者是 後者是對以前的問題進行計算,以得出當前問題的大結果。2 它們的典例和運用遞迴 遞推dfs,搜尋與回溯 動態規劃 用遞推能做的,記憶化搜尋定能夠實現 遞推僅能求方案數,求具體方案需用遞迴 3 各種關於遞推的例題 爬樓梯 數樓梯 兔子問題 includeusing name...