第二部分 基礎演算法 --> 第三章 遞推演算法
遞推演算法
1312【例3.4】昆蟲繁殖
【題目描述】科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。每對成蟲過x個月產y對卵,每對卵要過兩個月長成成蟲。假設每個成蟲不死,第一個月只有一對成蟲,且卵長成成蟲後的第一個月不產卵(過x個月產卵),問過z個月以後,共有成蟲多少對?0≤x≤20,1≤y≤20,x≤z≤50。
【輸入】x,y,z的數值。
【輸出】過z個月以後,共有成蟲對數。
【輸入樣例】1 2 8
【輸出樣例】37
【題解】
#include<stdio.h> const int N=51; long long a[N], b[N];//成蟲對數,卵對數 int main(){ int x,y,z; scanf("%d%d%d", &x, &y, &z); for(int i=1; i<=z; i++) a[i]=1, b[i]=0;//成蟲,卵數初始化 for(int i=x+1; i<=z+1; i++){ b[i] = y*a[i-x]; //卵數與成蟲數量有關 a[i] = a[i-1] + b[i-2]; //成蟲與上月成蟲和前2月卵數有關 } printf("%lld",a[z+1]); return 0; }
1313【例3.5】位數問題
【題目描述】在所有的N位數中,有多少個數中有偶數個數字3?由於結果可能很大,你只需要輸出這個答案對12345取餘的值。
【輸入】讀入一個數N(N≤1000)。
【輸出】輸出有多少個數中有偶數個數字3。
【輸入樣例】2
【輸出樣例】73
【題解】
1314【例3.6】過河卒(Noip2002)
【題目描述】棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上的某一點有一個對方的馬(如C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點,如圖中的C點和P1,……,P8,卒不能通過對方馬的控制點。棋盤用座標表示,A點(0,0)、B點(n, m) (n,m為不超過20的整數),同樣馬的位置座標是需要給出的,C≠A且C≠B。現在要求你計算出卒從A點能夠到達B點的路徑的條數。
【輸入】給出n、m和C點的座標。
【輸出】從A點能夠到達B點的路徑的條數。
【輸入樣例】8 6 0 4
【輸出樣例】1617
【題解】
1188 菲波那契數列(2)
【題目描述】菲波那契數列是指這樣的數列: 數列的第一個和第二個數都為1,接下來每個數都等於前面2個數之和。
給出一個正整數a,要求菲波那契數列中第a個數對1000取模的結果是多少。
【輸入】第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括一個正整數a(1 <= a <= 1000000)。
【輸出】n行,每行輸出對應一個輸入。輸出應是一個正整數,為菲波那契數列中第a個數對1000取模得到的結果。
【輸入樣例】
4
5
2
19
1
【輸出樣例】
5
1
181
1
【題解】
1189 Pell數列
【題目描述】Pell數列a1,a2,a3,...的定義是這樣的,a1=1,a2=2,...,an=2an?1+an?2(n>2)。
給出一個正整數k,要求Pell數列的第k項模上32767是多少。
【輸入】第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括一個正整數k (1≤k<1000000)。
【輸出】n行,每行輸出對應一個輸入。輸出應是一個非負整數。
【輸入樣例】
2
1
8
【輸出樣例】
1
408
【題解】
點選檢視程式碼
1190 上臺階
【題目描述】樓梯有n(71>n>0)階臺階,上樓時可以一步上1階,也可以一步上2階,也可以一步上3階,程式設計計算共有多少種不同的走法。
【輸入】輸入的每一行包括一組測試資料,即為臺階數n。最後一行為0,表示測試結束。
【輸出】每一行輸出對應一行輸入的結果,即為走法的數目。
【輸入樣例】
1
2
3
4
0
【輸出樣例】
1
2
4
7
【題解】
1191 流感傳染
【題目描述】有一批易感人群住在網格狀的宿舍區內,宿舍區為n*n的矩陣,每個格點為一個房間,房間裡可能住人,也可能空著。在第一天,有些房間裡的人得了流感,以後每天,得流感的人會使其鄰居傳染上流感,(已經得病的不變),空房間不會傳染。請輸出第m天得流感的人數。
【輸入】
第一行一個數字n,n不超過100,表示有n*n的宿舍房間。
接下來的n行,每行n個字元,’.’表示第一天該房間住著健康的人,’#’表示該房間空著,’@’表示第一天該房間住著得流感的人。
接下來的一行是一個整數m,m不超過100。
【輸出】輸出第m天,得流感的人數。
【輸入樣例】
5
....#
.#.@.
.#@..
#....
.....
4
【輸出樣例】
16
【題解】
1192 放蘋果
1193 吃糖果
1194 移動路線
【題目描述】X桌子上有一個m行n列的方格矩陣,將每個方格用座標表示,行座標從下到上依次遞增,列座標從左至右依次遞增,左下角方格的座標為(1,1),則右上角方格的座標為(m,n)。
小明是個調皮的孩子,一天他捉來一隻螞蟻,不小心把螞蟻的右腳弄傷了,於是螞蟻只能向上或向右移動。小明把這隻螞蟻放在左下角的方格中,螞蟻從左下角的方格中移動到右上角的方格中,每步移動一個方格。螞蟻始終在方格矩陣內移動,請計算出不同的移動路線的數目。
對於1行1列的方格矩陣,螞蟻原地移動,移動路線數為1;對於1行2列(或2行1列)的方格矩陣,螞蟻只需一次向右(或向上)移動,移動路線數也為1……對於一個2行3列的方格矩陣,如下圖所示:
【輸入】輸入只有一行,包括兩個整數m和n(0 < m+n ≤ 20),代表方格矩陣的行數和列數,m、n之間用空格隔開。
【輸出】輸出只有一行,為不同的移動路線的數目。
【輸入樣例】2 3
【輸出樣例】3
【題解】
1195 判斷整除
【題目描述】一個給定的正整數序列,在每個數之前都插入+號或?號後計算它們的和。比如序列:1、2、4共有8種可能的序列:
(+1) + (+2) + (+4) = 7
(+1) + (+2) + (-4) = -1
(+1) + (-2) + (+4) = 3
(+1) + (-2) + (-4) = -5
(-1) + (+2) + (+4) = 5
(-1) + (+2) + (-4) = -3
(-1) + (-2) + (+4) = 1
(-1) + (-2) + (-4) = -7
所有結果中至少有一個可被整數k整除,我們則稱此正整數序列可被k整除。例如上述序列可以被3、5、7整除,而不能被2、4、6、8……整除。注意:0、?3、?6、?9……都可以認為是3的倍數。
【輸入】輸入的第一行包含兩個數:N(2<N<10000)和k(2<k<100),其中N代表一共有N個數,k代表被除數。第二行給出序列中的N個整數,這些整數的取值範圍都0到10000之間(可能重複)。
【輸出】如果此正整數序列可被k整除,則輸出YES,否則輸出NO。(注意:都是大寫字母)
【輸入樣例】
3 2
1 2 4
【輸出樣例】
NO
1196 踩方格
【題目描述】有一個方格矩陣,矩陣邊界在無窮遠處。我們做如下假設:
a、每走一步時,只能從當前方格移動一格,走到某個相鄰的方格上;
b、走過的格子立即塌陷無法再走第二次;
c、只能向北、東、西三個方向走;
請問:如果允許在方格矩陣上走n步,共有多少種不同的方案。2種走法只要有一步不一樣,即被認為是不同的方案。
【輸入】允許在方格上行走的步數n(n≤20)。
【輸出】計算出的方案數量。
【輸入樣例】2
【輸出樣例】7
1197 山區建小學
【題目描述】政府在某山區修建了一條道路,恰好穿越總共m個村莊的每個村莊一次,沒有迴路或交叉,任意兩個村莊只能通過這條路來往。已知任意兩個相鄰的村莊之間的距離為di(為正整數),其中,0<i<m。為了提高山區的文化素質,政府又決定從m個村中選擇n個村建小學(設0<n≤m<500)。請根據給定的m、n以及所有相鄰村莊的距離,選擇在哪些村莊建小學,才使得所有村到最近小學的距離總和最小,計算最小值。
【輸入】
第1行為m和n,其間用空格間隔
第2行為m?1 個整數,依次表示從一端到另一端的相鄰村莊的距離,整數之間以空格間隔。
例如:
10 3
2 4 6 5 2 4 3 1 3
表示在10個村莊建3所學校。第1個村莊與第2個村莊距離為2,第2個村莊與第3個村莊距離為4,第3個村莊與第4個村莊距離為6,...,第9個村莊到第10個村莊的距離為3。
【輸出】各村莊到最近學校的距離之和的最小值。
【輸入樣例】
10 2
3 1 3 1 1 1 1 1 3
【輸出樣例】
18