1. 程式人生 > 其它 >第二部分 基礎演算法 --> 第三章 遞推演算法

第二部分 基礎演算法 --> 第三章 遞推演算法

目錄

遞推演算法

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