遞推法是一種重要的數學方法,在數學的各個領域中都有廣泛的運用,也是計算機用於數值計算的乙個重要算。
特點:
在已知條件和所求問題之間總存在著某種相互聯絡的關係,如果可以找到前後過程之間的數量關係(即遞推式),那麼,從問題出發逐步推到已知條件,此種方法叫逆推。
無論順推還是逆推,其關鍵是要找到遞推式。
fibonacci 數列:0,1,1,2,3,5,8,13,21,34,……
遞推關係:
f0 = 0
f1 = 1
fn = fn-1 + fn-2 ( n >= 2 )
實現**:
#include
using
namespace std ;
intmain()
if( n >
(i-1)*
2) cout << a0+a1 << endl ;
return0;
}
求n層漢諾塔的移動次數
遞推關係:
f(n)=2*f(n-1)+1
邊界條件:
f(1)=1
實現**:
#include
using
namespace std;
intmain()
;int n;
cin>>n;
for(
int i=
2;i<=n;i++
) f[i]=2
*f[i-1]
+1; cout<
}
問題描述:猴子第一天採摘了一些桃子,第二天吃了第一天的一半多乙個,第三天吃了第二天的一半多乙個…直到第十天就剩下乙個。問:猴子第一天摘了多少桃子?
遞推關係:
f(n)=f(n-1)/2-1
f(n-1)=(f(n)+1)*2
邊界條件:
f(10)=1
**實現:
#include
using
namespace std;
intmain()
問題描述:名名的媽媽從外地出差回來,帶了一盒好吃又精美的巧克力給名名(盒內共有 n 塊巧克力,20 > n >0)。
媽媽告訴名名每天可以吃一塊或者兩塊巧克力。假設名名每天都吃巧克力,問名名共有多少種不同的吃完巧克力的方案。
演算法分析:
如果n=1,則名名第1天就吃掉它,共有1種方案;
如果n=2,則名名可以第1天吃1塊,第2天吃1塊,也可以第1天吃2塊,共有2種方案;
如果n=3,則名名第1天可以吃1塊,剩2塊,也可以第1天吃2塊剩1塊,所以名名共有2+1=3種方案;
如果n=4,則名名可以第1天吃1塊,剩3塊,也可以第1天吃2塊,剩2塊,共有3+2=5種方案。
f[i] = f[i - 1] + f[i - 2]
**實現:
#include
using
namespace std;
intmain()
; f[1]
=1; f[2]
=2;for
(int i =
3; i <=
20; i++
)int n;
while
(cin >> n)
return0;
}
問題描述:
科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。
每對成蟲過x個月產y對卵,每對卵要過兩個月長成成蟲。
假設每個成蟲不死,第乙個月只有一對成蟲,且卵長成成蟲後的第乙個月不產卵(過x個月產卵).
問過z個月以後,共有成蟲多少對?0=演算法分析:
每個月都有成蟲產卵。
蟲卵經過兩個月才能變成成蟲,產卵。
每個月的成蟲數量是?
由前上個月的成蟲和兩個月之前的蟲卵數量計算
每個月的蟲卵是由i-x個月的成蟲決定(i是當前月份。為什麼不是上個月的成蟲?)
定義陣列f,f[i]表示第i月昆蟲成蟲的數量
新增乙個輔助陣列b,b[i]表示第i月的卵的數目,從而得到兩個公式:
b[i] = f[i - x] * y; (成蟲經過x月產卵 y對)f[i] = f[i - 1] + b[i - 2]; (卵經過2個月長成成蟲)
**實現:
#include
using
namespace std;
intmain()
,b[101]=
,i,j,x,y,z;
cin>>x>>y>>z;
for(i=
1;i<=x;i++
)for
(i=x+
1;i<=z+
1;i++)
cout<
}
問題描述:
把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)5,1,1和1,5,1 是同一種分法。
input
一行,包含二個整數m和n,以空格分開。1<=m,n<=10。
output
用一行輸出相應的k。
演算法分析:
設f(m,n) 為m個蘋果,n個盤子的放法數目,則先對n作討論,
當n>m:
必定有n-m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if(n>m) f(m,n) = f(m,m)
當n<=m:不同的放法可以分成兩類:
1、有至少乙個盤子空著,即相當於
f(m,n) = f(m,n-1);
2、所有盤子都有蘋果,相當於可以從每個盤子中拿掉乙個蘋果,不影響不同放法的數目,即
f(m,n) = f(m-n,n).
而總的放蘋果的放法數目等於兩者的和,即
f(m,n)=f(m,n-1)+f(m-n,n)
邊界條件說明:
當n=1時,
所有蘋果都必須放在乙個盤子裡,所以返回1;
當沒有蘋果可放時,
定義為1種放法;
**實現:
#include
using
namespace std;
intmain()
for(
int i=
0;i<=n;
++i)
dp[0]
[i]=1;
//蘋果0個時,定義為1種情況
for(
int i=
1;i<=m;
++i)
} cout<[n]
}
第一章 遞推演算法
特點 乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,如果可以找到前後過程之間的數量關係 即遞推式 那麼,從問題出發逐步推到已知條件,此種方法叫逆推。無論順推還是逆推,其關鍵是要找到遞推式。猴子吃桃 遞推關係 f n f n 1 2 1 f n 1 f n 1 2 ...
第一章 遞推演算法
解題方法 在已知條件和所求問題之間總存在著某種相互聯絡的關係,關鍵是前後過程之間的數量關係 即遞推式 然後進行順推或逆推。1.求斐波那契數列的前n項和 fibonacci 數列 0,1,1,2,3,5,8,13,21,34,f0 0 f1 1 fn fn 1 fn 2 n 2 關鍵 int n,i,...
演算法基礎第一章
不同常數時間的操作 加或定址運算或位運算 執行時間不一樣 選擇最小的數,放到陣列的第乙個位置 時間複雜度 c n c n 1 c n 2 c 1 o n 2 額外空間複雜度 o 1 兩兩比較並交換,直到無交換 時間複雜度 o n 2 額外空間複雜度 o 1 左邊序列有序,右邊新加入乙個數,從右往左找...