#問題描述
一層樓共有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位址由網路位址和主機位址兩部分組成,分配...