1. 程式人生 > >遞推與遞迴二分——臺階問題

遞推與遞迴二分——臺階問題

洛谷 P1192 臺階問題
題目描述
有N級的臺階,你一開始在底部,每次可以向上邁最多K級臺階(最少1級),問到達第N級臺階有多少種不同方式。
輸出mod 100003後的結果

分析
與數樓梯問題幾乎雷同,於是我們可以看出來:數樓梯問題其實數列還是11235,但是開頭那個1放第0位(然而用不上),在這裡可以用上了。
若是這樣的陣列情況(第一排是值,第二排下標)
1 1 2 3 5 8 13
0 1 2 3 4 5 6
就很輕易可以得出,這裡斐波那契數列變種成為for j=1 to k do a[i]=(a[i]+a[i-j])mod 100003
但是又有一個問題:C++陣列不可以自定義開始下標,也就是不能呼叫負數下標,怎麼辦呢?
方法就是以負數絕對值為開始計算即可

#include <iostream>
#include <cstdio>
using namespace std;
int n,k,i,j,a[111111];
int main()
{
    scanf("%d%d",&n,&k);
    a[999]=1;
    for (i=1000;i<=n+999;i++)
     for (j=1;j<=k;j++)    
      a[i]=(a[i]+a[i-j])%100003;
    printf("%d",a[i-1]);
}