洛谷 下楼梯 动态规划
题目描述
顽皮的小明发现,下楼梯时每步可以走 1 个台阶、2 个台阶或 3 个台阶。现在一共有 N 个台阶,你能帮小明算算有多少种方案吗?
输入格式
输入一行,包含一个整数 N。
输出格式
输出一行一个整数表示答案。
输入输出样例
输入 #1复制
4
输出 #1复制
7
输入 #2复制
10
输出 #2复制
274
说明/提示
对全部的测试点,保证 1≤N≤60。
代码://深度优先搜索 !!!超时,因为DFS的时间复杂度是指数级的(O(3^N))!
#include <bits/stdc++.h>
#define MX 100
using namespace std;
int cnt = 0;
void dfs(int x)
{
if(x == 0){
cnt++;
return;
}
if(x >= 1)
{
dfs(x-1);
}
if(x >= 2)
{
dfs(x-2);
}
if(x >= 3)
{
dfs(x-3);
}
}
int main() {
int n;
cin>>n;
dfs(n);
cout<<cnt<<endl;
return 0;
}
代码2://动态规划
#include <bits/stdc++.h>
#define MX 100
using namespace std;
//动态规划:将复杂问题分解为多个小问题
//注意数据范围!!!
long long int dp[MX] = {0};
int main() {
int n;
cin>>n;
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for(int i = 4; i <= n; i++) {
dp[i] = dp[i-3] + dp[i-2] + dp[i-1];
}
cout<<dp[n]<<endl;
return 0;
}