我叫關小破承璃,是一個輕微幻聽癥患者。
今天上午9點15分望抽,收到女友瑾兒發(fā)來的語音,她約我到LTG咖啡館見面履婉,說是要帶我去一家新開的心境診所煤篙,名字聽上去很像是看心理或者精神問題的。
女朋友定的這家咖啡館很是難找毁腿,問了3個人辑奈,才在一個巷子深處找到它苛茂。這個巷子很長,很亂鸠窗,很嘈雜妓羊,各式各樣的店鋪很多,沒有一般咖啡館周圍環(huán)境的那種清幽稍计。
電線桿上的電子牌顯示著:LTG咖啡館侍瑟,左面樓梯直上三樓。現在是11點44分丙猬,離女朋友約定的時間還有16分鐘,我看到了這個樓梯费韭〖肭颍“我靠,好長”星持,狹長的棕色木質樓梯抢埋,意亂情迷的五彩燈光,墻上貼滿了金屬朋克風的裝飾畫督暂,唯一煞風景的就是臺階上貼的租房和各式神醫(yī)小卡片揪垄。
樓梯口旁邊有個牌子上用粉筆楷體字寫著:此樓梯一共五十階,為遠離塵世煩惱逻翁,臺階稍高饥努,來者量力而行,每次一階或者兩階八回。我試了試酷愧,三階確實有點扯。估計每個來的人都會像我這樣扯一次缠诅。就這樣溶浴,我有時一階,有時兩階管引∈堪埽快到樓梯盡頭時,從上面走下來一個胡子比頭發(fā)還濃密褥伴,帶著黑色圓框眼睛的中年人谅将,這個資源沒得到合理配置的男人突然站住。他真的很客氣重慢,離我還有九個臺階就側身示意我先過戏自,當然我也比較有修養(yǎng),我不禁三步并做兩步伤锚,也顧不得當下的扯與不扯擅笔。
“不急志衣,小伙子,我來這里很多次了猛们,我每次上臺階都不會和以前走的一樣念脯,另外我怕扯,每次都是一階或者兩階弯淘,今天是我最后一次來這里绿店,你能告訴我,我來這里多少次了嗎”庐橙。聽到這里假勿,我停了下來倚在墻上,這個中年人慢慢走向我态鳖,一股濃濃的酒精味撲面而來转培。他游離的眼神中帶著滿滿的期許不斷的打量著我,我在腦海中快速總結了一下他心中的疑惑浆竭。
“50級臺階的樓梯浸须,從下往上走,每跨一步只能向上1級或者2級臺階邦泄,共有多少種走法”
此刻是11點50分删窒,暴力可以解決問題,但是與這個樓梯的獨特氣質不符顺囊,主要是10分鐘可能得不出中年男人想要的結果肌索,從而讓一個女人理直氣壯的爆發(fā)。
++++++++正兒八經的分割線++++++++
動態(tài)規(guī)劃:大事化小特碳,小事化了驶社。
動態(tài)規(guī)劃是一種解決問題的方法,通過將問題分解為子問題测萎,并總結關系亡电,得到解決問題的思路。
問題分析:逆向思維
令T(50)表示所有的走法硅瞧。當我站在50級臺階的時候份乒,我要么是從49級臺階走了1階上來的,要么是從48階臺階走了2階上來的腕唧。因此T(50)=T(49)+T(48)或辖,同理可推得T(49)=T(48)+T(47)、T(49)=T(48)+T(47)……T(3)=T(2)+T(1)枣接、T(2)=2颂暇、T(1)=1。這樣就把原來的求T(50)的問題但惶,轉換為求T(49)耳鸯、T(48)………T(3)這樣的子問題湿蛔。T(2)=2、T(1)=1稱為這個問題的邊界條件县爬,試想如果沒有邊界條件阳啥,就會分解為無限個子問題,因此得不到問題的解财喳。類似T(50)=T(49)+T(48)這樣的表達式稱為這個問題的狀態(tài)轉移方程察迟;50,49……3,2這樣的數字可以看成問題的狀態(tài)。
Python3實現
#遞歸實現
def Floor_Recursion(number):
if number==1:#邊界條件
return 1
if number==2:#邊界條件
return 2
return Floor_Recursion(number-1)+Floor_Recursion(number-2)#狀態(tài)轉移方程
遞歸實現簡單耳高,但是容易造成棧溢出扎瓶。分析其原因,是因為上面的程序調用了太多重復的結果泌枪,因此需要優(yōu)化概荷。一種方法被稱為備忘錄,就是把需要程序用到的結果儲存起來工闺,例如Python的字典存儲。
#備忘錄
def Floor_Memo(number):
memo={1:1,2:2}#邊界條件
count=2
while count<number:
count+=1
memo[count]=memo[count-1]+memo[count-2]#狀態(tài)轉移方程
return memo[number]
還有一種方法稱為動態(tài)規(guī)劃瓣蛀,這需要仔細分析問題的狀態(tài)轉移方程陆蟆。以本問題為例,每一個狀態(tài)只是和之前的2個狀態(tài)有關惋增。因此實際上只需要存儲2個結果叠殷。
#動態(tài)規(guī)劃
def Floor_DP(number):
if number==1:#邊界條件
return 1
if number==2:#邊界條件
return 2
result=[1,2]#只存儲前2次結果
count=2
while count<number:
nexta=sum(result)
result=[result[1],nexta]#等同于狀態(tài)轉移方程
count+=1
return result[-1]
print(Floor_DP(50))
#結果:20365011074
++++++++嬉皮笑臉的分割線++++++++
看著屏幕上出現的結果,兩百……诈皿,我不由得一怒林束。這胡瓢瓢是在逗我嗎』鳎看來我得使用暴力了壶冒。空氣中只是彌漫著淡淡的酒精味截歉,胡瓢瓢已不見了蹤影胖腾。12點00分了都伪,忍著扯痛土砂,趕緊邁上去。
來到了咖啡館的門口们豌,大大的LTG霓虹燈閃爍宵睦,布魯斯藍調音樂時隱時現记罚,門上掛個牌子寫著:方便人流,只進不出壳嚎⊥┲牵看著人流兩字末早,不由得一哆嗦以為到了黑診所。推開門酵使,里面還真看不出是個咖啡館荐吉,沒有多少咖啡的香氣,倒是酒精的氣味更濃烈口渔。
“這是LTG咖啡店嗎”
“是的样屠,先生,請問您需要什么”
“你們這里怎么這么大的酒精味啊”
“哦缺脉,先生痪欲,咖啡館在里面的,這外面是酒吧攻礼,外面消愁业踢,里面尋歡”
“我其實是來消愁的,我可以做里面嗎”
“里面不允許喝酒的礁扮,先生”
“我不點酒”
“先生知举,您需要點點什么”
“這個門寫著只進不出,為什么剛才有個人出去了”
“剛才嗎太伊,那個人是我們老板雇锡。先生,請問您需要什么”
“兩杯熱果汁”
“先生僚焦,您有現金嗎锰提,34,我們這里的付錢二維碼需要升級芳悲,老板暫時不讓用了立肘,因為我們老板是聾啞人,以后每一筆通過二維碼的消費名扛,都會向聾啞人基金會自動捐款谅年。”
“先生肮韧,您沒事吧”
“哦踢故,哦,我沒事惹苗,我有現金殿较,給”
我拿著兩杯果汁,穿過充斥著酒話桩蓉、沉悶的外屋淋纲,進了里屋。里屋很安靜院究,是很小的一個咖啡館洽瞬,復古仿歐式的裝潢本涕,還摻雜一些地中海式的裝飾,《Five Hundred Miles》的聲音可以直達人心伙窃。我四處張望菩颖,尋找我的女朋友。
“破罐子为障,我在著呢”
我循著聲音向身后望去晦闰,女朋友瑾兒正在一個角落里,笑的很開心鳍怨。
“瑾兒呻右,我好像有些加重了,你說的那個新開的叫什么心境的診所鞋喇,怎么樣啊”
“什么診所啊声滥,什么怎么樣啊,我沒和你說過啊”
“你今天早上發(fā)語音和我說的啊侦香,你不信自己聽”落塑,我掏出手機,卻不敢摁下那段語音的重放罐韩。
“哈哈憾赁,傻罐子,我逗你的”
“只有一句話伴逸,你不用擔心會是幻聽缠沈,那就是我愛你膘壶,破罐子错蝴。因為你每一次聽到,都是我真實的在說”
“LTG颓芭,這個名字什么意思啊顷锰,挺有創(chuàng)意的啊,我覺得是三個對老板特別有意義的首寫字母亡问,你說會不會是老板的女朋友的名字縮寫啊”
“我不這么認為官紫,我覺得像是樓梯高的縮寫,哈哈”