P1192 台阶问题(递推)
生活随笔
收集整理的這篇文章主要介紹了
P1192 台阶问题(递推)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.luogu.org/problemnew/show/P1192
題目描述
有N級的臺階,你一開始在底部,每次可以向上邁最多K級臺階(最少11級),問到達第N級臺階有多少種不同方式。
輸入輸出格式
輸入格式:
兩個正整數N,K。
輸出格式:
一個正整數,為不同方式數,由于答案可能很大,你需要輸出ans mod 100003后的結果。
輸入輸出樣例
輸入樣例#1:
5 2
輸出樣例#1:
8
Ac_code:
way1:
way2:
/* 進一步找規律,效率明顯提高: 1. n<= k: f(n+1)=f(n)*2; 2. n > k: f(n+1) = f(n)*2 - f(n-k); */ #include <stdio.h> #define mod 100003 int a[100005]; int main() {int n,k;a[0] = a[1] = 1;scanf("%d%d",&n,&k);for(int i = 2; i <= k; i++)//或者只用這層循環a[i]=2*a[i-1]{for(int j = 1;i-j>=0&&j<=k; j++){a[i] += a[i-j];a[i] %= mod;}//a[i] = 2*a[i-1]%mod;}for(int i = k+1; i <= n; i++){a[i] = (2*(a[i-1])%mod-a[i-1-k]%mod+mod)%mod;}printf("%d\n",a[n]);return 0; }way3:
/* 看了一下別人的題解,說可以記憶化爆搜。 但是n=100000時,沒有輸出,提交居然AC,這題數據太水! */ #include <stdio.h> #define mod 100003 int a[100005],k; int Find(int x) {if(a[x])return a[x];int sum = 0;for(int i = 1; x-i>=0&&i<=k; i++){sum = (sum + Find(x-i)) % mod;}a[x] = sum;return sum; } int main() {int n;a[0] = a[1] = 1;scanf("%d%d",&n,&k);printf("%d\n",Find(n));return 0; }總結
以上是生活随笔為你收集整理的P1192 台阶问题(递推)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1768: 回文平方数(进制转换)
- 下一篇: P2055 [ZJOI2009]假期的宿