1 solutions
-
1
#include <bits/stdc++.h> using namespace std; const int N = 105; int n, m, cnt; int query[N]; long long f[N]; int main() { while(cin >> m, m) { n = max(n, m); query[cnt ++ ] = m; } f[1] = 1, f[2] = 2, f[3] = 4; for(int i = 4; i <= n; i ++ ) f[i] = f[i - 1] + f[i - 2] + f[i - 3]; for(int i = 0; i < cnt; i ++ ) cout << f[query[i]] << endl; return 0; }
我们可以枚举一下每个状态是由那些状态转移过来的 题目给了明确的暗示, 说了可以从第i层可以从第i-1,i-2,i-3层到达 那就说明对于所有关于从第i-1,i-2,i-3层 的跳法可以被沿用到第i层 所以就得到了状态转移方程f[i] = f[i - 1] + f[i - 2] + f[ - 3]; 这题可以加点小优化,我们存储一下所有的询问 然后找一下最大要跳的层数 然后先预处理的一下, 剩下的就是对于所有的询问查表就可以了 然后这题的范围是70多, 通常到30, 40 左右就会超出int的最大范围, 所以对于这题我们要开long long
- 1
Information
- ID
- 417
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 2
- Accepted
- 1
- Uploaded By