【例1】
description
在2×n的乙個長方形方格中,用乙個1×2的骨牌鋪滿方格,輸入n ,輸出鋪放方案的總數. 例如n=3時,為2×3方格,骨牌的鋪放方案有三種,如下圖:
輸入資料由多行組成,每行包含乙個整數n,表示該測試例項的長方形方格的規格是2×n (0< n<=50)。
output
對於每個測試例項,請輸出鋪放方案的總數,每個例項的輸出佔一行。
sample input13
2sample output13
2參考程式
#include
#define len 50
intmain()
printf
("%lld\n"
,a[n]);
}return0;
}
分析
問題的本質是斐波那契數列。①當n=1時,骨牌只能豎放,即僅1種方案;②當n=2時:考慮第一塊骨牌,若豎放時,則剩餘乙個方格只能豎放.若橫放時,則一次性占用兩個方格,不再有多餘的空格。所以一共2種方案。③n個方格時,第一步考慮豎放,則後面剩餘的n-1個空餘方格通過前面的結果得出;也可以第一步考慮橫放,則後面n-2個空餘方格也可以通過前面的結果得出。根據分類加法原理,將兩類第一步下的方法加總,從而得到了遞推關係,即得到n個方格時的情形。
【例2】
description
在3×n的乙個長方形方格中,用乙個1×3的骨牌鋪滿方格,輸入n,輸出鋪放方案的總數. 例如n=4時,為3×4方格,骨牌的鋪放方案有3種。
input
輸入資料由多行組成,每行包含乙個整數n,表示該測試例項的長方形方格的規格是3×n (0< n<=50)。
output
對於每個測試例項,請輸出鋪放方案的總數,每個例項的輸出佔一行。
sample input12
34sample output11
23參考程式
#include
#define len 50
intmain()
printf
("%lld\n"
,a[n]);
}return0;
}
分析
與例1相同。①當n=1時,骨牌只能豎放,即僅1種方案;②當n=2時:無法橫放,兩塊骨牌都只能豎放,即僅1種方案;③當n=3時:考慮第一塊骨牌,若豎放時,則剩餘兩個方格也只能豎放,1種方案。若第一塊骨牌橫放時,則一次性占用3個方格,不再有多餘的空格,剩餘兩塊也都橫放,1種方案。所以一共2種方案。④n個方格時,第一步考慮豎放,則後面剩餘的n-1個空餘方格通過前面的結果得出;也可以第一步考慮橫放,則後面n-3個空餘方格也可以通過前面的結果得出。根據分類加法原理,將兩類第一步下的方案加總,從而得到了遞推關係,即n個方格時的情形。
【例3】
description
請在1×n的乙個長方形方格中,任選1×1、1×2和1×3的骨牌鋪滿方格, 輸入n,輸出鋪放方案的總數. 例如n=3時,為1*3的方格,骨牌的鋪放方案有4種
input
多組輸入,輸入到eof結束,每行包含乙個整數n,表示該測試例項的長方形方格的規格是1×n (0< n<=30)。
output
對於每個測試例項,請輸出鋪放方案的總數,每個例項的輸出佔一行。
sample input12
34sample output12
47參考程式
#include
#define len 50
intmain()
printf
("%lld\n"
,a[n]);
}return0;
}
分析
本題與前兩例略有不同,但思路仍是斐波那契數列。①當n=1時:只能選乙個1×1規格的骨牌填入,即僅1種方案;②當n=2時:可以填入兩個1×1規格的骨牌,也可以填入乙個1×2規格的骨牌,即2種方案;③當n=3時:第一步可以填入乙個1×1規格的骨牌,然後剩餘兩個空餘方格按n=2的情形計算,2種方案。第一步也可以一次性填入乙個1×2規格的骨牌,然後剩餘1個空餘方格按n=1的情形計算,1種方案。還可以一次性填入乙個1×3規格的骨牌,再沒有空餘的方格,1種方案。所以一共4種方案;④其他n個方格時:第一步可以填入1個1×1規格的骨牌,然後剩餘n-1個方格根據之前的結果得出。第一步也可以填入乙個1×2規格的骨牌,然後剩餘n-2個根據之前的結果得出。第一步還可以填入乙個1×3規格的骨牌,然後剩餘n-3個空餘方格根據之前的結果得出。根據分類加法原理,將三類第一步下的方法加總,從而得出遞推關係,即得到n個方格的情形。
資料結構與演算法(三)
變位詞是指兩個詞之間存在組成字母的 重新排列關係 如 heart和earth,python和typhon 為了簡單起見,假設參與判斷的兩個詞僅由小寫 字母構成,而且長度相等 詞1中的字元逐個在詞2中檢查是否存在,存在則標記防止重複檢查。如果每個字元都能找到,並且詞1詞2長度相同則是變位詞。否則不是。...
資料結構與演算法(三)
鍊錶由單向的鏈變成雙向鏈,使用這種資料結構,我們不再拘束於單鏈表的單向建立於遍歷等操作。在單鏈表中,有乙個資料域,還有乙個指標域,資料域用來儲存相關資料,而指標域負責鍊錶之間的 聯絡 在雙向鍊錶中,需要有兩個指標域,乙個負責向後連線,乙個負責向前連線。單鏈表的結構 struct list 雙向鍊錶的...
13 資料結構與演算法 快速排序
created by chen da 快速排序的思想 選擇基準值pivot將陣列分成兩個子陣列,小於基準值的元素和大於基準值的元素 這個過程稱為partition 對兩個子陣列進行快速排序 合併結果。乙個簡單粗暴的遞迴快排 def quik sort array if len array 2 ret...