注:本文為回顧,所以僅會記錄本人認為的難點與分析個人認為,遞推與動態規劃實際是密不可分的,你說它簡單,但到了做題時難以找到轉移方程,你要是說它難,但它確確實實是最基本的東西了
這是一道最基礎的遞推題,根據對數列的描述,不難發現,從第3項開始,我們都可以用這樣乙個式子表示:\(f_i=f_+f_\)
因而,我們可以直接利用迴圈得到,**如下:
#include #include using namespace std;
int n,a,b[1000001],mmax = 2;
int main()
return 0;
}
題目傳送門:點這裡
這一道題其實可以看做一道最基礎的動態規劃,每一步有3個狀態,我們可以發現,當樓梯有1層時,僅有1種走法;當樓梯有2層時,有2種走法:走2個1層或1個2層;當樓梯有3層時,有4種走法:一次三層,三次一層,2、1和1,2;再往後,我們可以發現,i層時可行方法為i-1層i-2層i-3層的方法數總和,即\(f_i=f_+f_+f_\),而\(f_1=1,f_2=2,f_3=4\)為邊界條件,進行迴圈,按輸入得到結果即可,**如下:
#include #include using namespace std;
long long int n,f[72];
int main()
return 0;
}
題目傳送門:點這裡
這一道題則就是一種搜尋,其實並沒有太大的難度
具體細節詳見下方**:
#include #include using namespace std;
int n,t[101][101],o[101][101],m,ch[10001][2],last,now,ans; //o在本處並無實際用處,ch為佇列,ch[x][0]為行,ch[x][1]為列,last,now分別為佇列的頭和尾
int main()
else if (c == '#')
o[i][j] = t[i][j] = -1;
} //原圖的輸入
cin >> m;
for (int k = 2;k <= m;k ++)
if (j - 1 >= 0) //同上
if (t[i][j - 1] == 0)
if (t[i + 1][j] == 0)
if (t[i][j + 1] == 0)
} for (int i = last;i < now;i ++)
last = now;//清空佇列
} for (int i = 0;i < n;i ++) //統計
for (int j = 0;j < n;j ++)
if (t[i][j] == 1)
ans ++;
cout << ans ;
return 0;
}
題目傳送門:點這裡
搜尋與回溯,即深度優先搜尋(dps),屬於遞迴的一種,而且,許多遞推可做的題目同樣可用遞迴做出,如:斐波那契數列
這一道題可以說是十分基礎了,基本是必會的題目,主體思想很簡單,從第乙個皇后的位置進行選擇,然後依次判斷此行每個位置是否可以放下,如果是,進行遞迴,如果不行,判斷下一位置,然後進行回溯
#include#includeusing namespace std;
int a[30];
int b[30];
int c[30];
int d[30];
int flag=0;
void print()
{ flag++;
cout<<"no. "《題目傳送門:點這裡
日後優化持續跟進遞推與遞迴
遞推與遞迴 遞推像是多公尺諾骨牌,遞迴是大事化小。遞推的效率更高 遞推 斐波那契數列 例 母親為兒子的四年大學學費準備了一筆存款,兒子每月月底取下月生活費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...