商湯科技自動駕駛研究員2019校招筆試第一題-跳臺階(每次可跳1~m級,跳到第n級的跳法總數)
阿新 • • 發佈:2019-02-18
遞推公式如下:
n<=m時
v[n]=2<<(n-2)
n>m時
v[n]=2*v[n-1]-v[n-1-m]
輸入n超過10^18,考慮是維護一個供迭代的雙向佇列做動態規劃,更新尾部第i級臺階的跳法數,刪除頭部第i-m-1級臺階的跳法數,直到算出第n級的解。
#include<iostream> #include<deque> using namespace std; int main() { int m; long long n; int top,end; while(cin>>n>>m){ if(n<2) cout<<1<<endl; else if(n<=m) cout<<(2 << (n - 2)) % 10007<<endl; else { deque<int> d; d.push_back(1); d.push_back(1); for (auto i = 2; i <= m; ++i) { d.push_back((2 << (i - 2)) % 10007); } for (auto i = m + 1; i <= n; ++i) { top = d.back(); end = d.front(); d.pop_front(); d.push_back((2 * top - end) % 10007); } top = d.back(); while (top < 0) top += 10007; cout << top << endl; } } return 0; }