商湯2018 9 7筆試 台階問題

2021-08-27 13:43:08 字數 2953 閱讀 3584

#問題描述

一層樓共有n級台階,一次可以上至少1級但不超過m級台階,求有多少種不同的上樓方案數。由於結果可能很大,你只需要輸出結果對10007取模的值即可

輸入:

一行,正整數n和m

輸出:

乙個整數,對10007取模的結果

樣例輸入1:

4 3樣例輸出1:

7樣例輸入2:

1024 5

樣例輸出2:

先認為m總是等於n的,那麼:

當n=3時,有4種方案:

當n=4時,有8種方案:

當n=5時,有16種方案:

#思路整體思路是斐波那契數列,但是和常見的爬樓梯問題不一樣,常見爬樓梯問題是:每次只可以排1級台階或者2級台階,遞推公式是f(n)=f(n-1)+f(n-2);f(1)=1,f(2 )=2;其形式和斐波那契數列是一樣的(遞推公式後面是兩項)。

而此題是可以最多爬m級台階(遞迴公式後面是m項)。

分析測試用例,n很大,得到的結果如果不取模就更大(大得多),但m很小。

按照提示,寫出m=3,4,5,n=5情況下的方案數(注意這裡不是遞推,而是在提示裡按照m大小數方案):

觀察上面方案數,發現如果再加個f(0)=1,使用遞推式,f(n)=f(n-1)+f(n-2)+…+f(n-m),就可以得到遞推式了。

再以m=3為例,f(3)=f(0)+f(1)+f(2),f(4)=f(1)+f(2)+f(3),以此類推,驗證了正確性。

需要注意:初始條件只有f(0)=1 f(1)=1 f(2)=2就夠了,但是當m>=4的時候,遞迴式的後面有4項或者更多。比如當m=4時,計算f(3)時只能f(3) = f(0)+f(1)+f(2),雖然都說了m=4所以遞推式後面有4項但這裡卻只有3項用來計算,但f(3)前面只有3項啊,所以就把能加的加起來。

但這點在實際程式設計沒有影響,因為出現這種情況,只是多加幾個0.(詳見滾動陣列分析)

再來講優化:

1.儲存陣列大小:一般情況,陣列大小需要是n+1大小的,但考慮到n可能很大,所以我們需要使用滾動陣列,滾動陣列大小m即可,以m=3為例(索引從0到2),

發現使用m大小的滾動陣列即可。

2.儲存結果取餘:遞推式是累加的過程。所以每累加一次,就取餘%10007,和把最終結果%10007是一樣的,但前者就可以避免儲存過大的數。

#**普通方法:沒有上面兩處優化。

n,m =

map(

int,

input()

.split())

re =[0

]*(n+1

)re[0]

=1re[1]=

1re[2]

=2if n==1:

print(1

)elif n==2:

if(m==1)

:print(1

)else

:print(2

)else

:for i in

range(3

,n+1):

for j in

range

(i-1

,i-m-1,

-1):

re[i]

+= re[j]

print

(re[n]

%10007

)

這種方法在遇到大的n時就會很慢,以1024 5作為輸入為例,實際結果為:

而且還需要申請1024大小的陣列。

優化版本:

n,m =

map(

int,

input()

.split())

re =[0

]*(m)#滾動陣列,m個位置就夠用

re[0]=

1re[1]

=1re[2]=

2if n==1:

print(1

)elif n==2:

if(m==1)

:print(1

)else

:print(2

)else

:for i in

range(3

,n+1):

outer = i%m#指re中的索引

for j in

range

(outer+

1,outer+m)

:#遞推式後面有m項,但內層迴圈只迴圈m-1次

#因為是當前位置加上剩餘的m-1項

inner = j%m

re[outer]

=(re[outer]

+ re[inner])%

10007

print

(re[n%m]

)

商湯科技2020筆試題

題型分為20道選擇題和3道程式設計大題。1.選擇題 struct1與struct2的區別 乙個是stuts1 乙個是stuts2,這是最大的區別,技術方面,stuts1有個核心控制器,但是只提供了乙個介面,也就是execute,還要配置actionform之類的,很麻煩,所以依賴性比較強 而stut...

2015筆試記錄

0916去哪兒網 1.removeelement arr,index 這麼簡單的題竟然寫錯了,把splice方法的返回值記錯了,splice返回的是刪除的元素陣列!2.陣列亂序問題 以前看過fisher yates的洗牌演算法,所以有點思路,但還是有細節錯誤 math.random 的範圍是 0,1...

中興2016筆試

簡答題 1 ip位址和mac位址有什麼區別?為什麼要有這兩種位址?對於ip位址,相信大家都很熟悉,即指使用tcp ip協議指定給主機的32位位址。ip位址由用點分隔開的4個8八位組構成,如192.168.0.1就是乙個ip位址,這種寫法叫點分十進位制格式。ip位址由網路位址和主機位址兩部分組成,分配...