#动态规划是一种“从底至顶”的方法,从最小子问题的解开始,迭代的构建更大子问题的解,直到得到原问题的解。
思路:到第i个台阶的方案数=到第i-1个台阶的方案数+到第i-2个台阶的方案数
#include<iostream>
using namespace std;
int n;
int dp[5005][5005];//dp[i][]表示第i个台阶的方案数
int len = 1;//位数
void f(int x)
{
for (int i = 1;i <= len;i++)
{
dp[x][i] = dp[x - 1][i] + dp[x - 2][i];//每一位相加
}
int k = 0;
for (int i = 1;i <= len;i++)//进位操作
{
dp[x][i + 1] += dp[x][i] / 10;
dp[x][i] %= 10;
if (dp[x][len + 1])len++;//若下一位存在,则位数加1
}
}
int main()
{
cin >> n;
dp[1][1] = 1;//第一个台阶的方案数
dp[2][1] = 2;//第二个台阶的方案数
for (int i = 3;i <= n;i++)
{
f(i);//动态规划:由i-1和i-2的方案数构建i的方案数
}
for (int i = len;i >= 1;i--)//倒序输出
cout << dp[n][i];
}
做法相似的题目:洛谷 P2437 蜜蜂路线,