信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
ybt 1190:上臺階
OpenJudge NOI 2.3 3525:上臺階
注:ybt 1190最大數據數量為71,而OpenJudge 2.3 3525中最大數據數量為100。如果把數組a設為int,在OpenJuge中能過,但在ybt中不能過。
【題目考點】
1. 遞推
2. 記憶化遞歸
【解題思路】
1. 遞推
- 遞推狀態:aia_iai?:到第i階臺階的走法
- 初始狀態:
到第1個臺階有1種走法:a1=1a_1 = 1a1?=1。
到第2個臺階可以走兩步每次走1階,或一步跨2階,有2種走法:a2=2a_2 = 2a2?=2
到第3個臺階,可以走3步每次走1階,可以走一步1階一步2階,或一步2階一步1階,或一步3階,共4種走法:a3=4a_3 = 4a3?=4 - 遞推關系:
思考要想到走第i個臺階,前一步是在第幾個臺階。
可以是從第i-1個臺階走1階,到第i個臺階。到第i-1個臺階的走法為ai?1a_{i-1}ai?1?種,那么這種走法的種類數量為ai?1a_{i-1}ai?1?
可以是從第i-2個臺階一步走2階,到第i個臺階。這種走法的種類數量為ai?2a_{i-2}ai?2?
可以是從第i-3個臺階一步走3階,到第i個臺階。這種走法的種類數量為ai?3a_{i-3}ai?3?
所以走到第i個臺階的總走法數量為:ai=ai?1+ai?2+ai?3a_i = a_{i-1}+a_{i-2}+a_{i-3}ai?=ai?1?+ai?2?+ai?3?
該題有多次詢問,可以先通過遞推求出a1~a100a_1\sim a_{100}a1?~a100?,再根據輸入的序號在數組中取值。
注意:數組a的類型要設為long long
【題解代碼】
解法1:遞推
#include <bits/stdc++.h> using namespace std; int main() {long long a[105];int x;a[1] = 1, a[2] = 2, a[3] = 4;for(int i = 4; i <= 100; ++i)a[i] = a[i-1] + a[i-2] + a[i-3];while(cin >> x && x != 0)cout << a[x] << endl;return 0; }解法2:記憶化遞歸
#include <bits/stdc++.h> using namespace std; long long a[105]; long long solve(int x)//上x階臺階的走法數量 {if(a[x] > 0)return a[x];if(x == 1)return 1;else if(x == 2)return 2;else if(x == 3)return 4;elsereturn a[x] = solve(x-1) + solve(x-2) + solve(x-3); } int main() {int x;while(cin >> x && x != 0)cout << solve(x) << endl;return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通 1356:计算(cal
- 下一篇: 牧马人鼠标g13鼠标宏_达尔优EM910