#include <iostream> #include <string.h> #include <stdio.h> using namespace std; int dp[100050]; int main() { int n; while(scanf("%d",&n)!=EOF) { dp[0]=1;dp[1]=1;dp[2]=1;dp[3]=1; for(int i=4;i<=n;i++) { dp[i]=(dp[i-1]%10007+dp[i-3]%10007); } cout << dp[n]%10007 << endl; } return 0; }
Zlgg想要爬天梯而求仙道,他只有两种登山步法:凌波微步和逍遥游,分别能使他一次登上一级台阶、三级台阶。
问:他从第一级台阶爬到第N级台阶共有多少种走法?
状态:dp[i]代表走到第i级有dp[i]种走法;
状态转移方程:dp[i]=dp[i-1]+dp[i-3];