先看题:
分析:首先,这是一道典型的斐波那契类似题,同时,题目还有着高精度和动态规划的标签。
我们可以定义一个dp二维数组用来存放高精度数值。
动态转移方程为: dp[k][i] = dp[k-1][i] + dp[k-2][i]
#include<bits/stdc++.h>
using namespace std;
//len表示数值的总位数
//定义一个二维数组。例如dp[n][*]代表到第n阶阶梯有这么多种走法
int len=1, dp[5005][2000];
void hp(int k) {
//每一个数位的数值都进行动态转移方程
for (int i=1; i<=len; i++) {
dp[k][i] = dp[k-1][i] + dp[k-2][i];
}
//如果单个数位上的数字满10,则向高位进一位。
//同时,如果此时最高位也满了,则继续进一位,并将len加1
for (int i = 1; i <= len; ++i) {
if(dp[k][i] > 9) {
dp[k][i] %= 10;
dp[k][i+1]++;
if(dp[k][len+1] > 0) {
len++;
}
}
}
}
int main () {
int n;
cin >> n;
dp[0][1] = 0;
dp[1][1] = 1;
dp[2][1] = 2;
//dp[i] = dp[i-1] + dp[i-2]
for (int i = 3; i <= n; ++i) {
hp(i);
}
//输出用数组表示的大数时,由于高位在后,则需要倒着输出
for (int i = len; i > 0; --i) {
cout << dp[n][i];
}
return 0;
}