“ Ctrl AC!一起 AC!”
题目:忘题戳这
分析:
这是一道可以用dp写的题,答案的数值很大,需要用到高精度加法
设dp[num][0~len]。其中num指总列数,dp[num][0]表示num列的答案的数的长度,dp[num][1]表示答案数值第一位(最低位)的数值大小,以此类推。
易知dp方程为:dp[i][j]=dp[i-1][j]+dp[i-2][j]*2;
浅推方程:
(图片纠错:地位->低位; dp[5][2]等于5)
那么dp[a]就等于357;推出状态方程:dp[i][j]=dp[i-1][j]+dp[i-2][j]*2,然后高精度计算就可以了。
先预处理,再输入数据。
AC代码:
#include<iostream>
using namespace std;
int dp[255][100];
int main() {
dp[1][0] = 1;
dp[1][1] = 1;
dp[2][0] = 1;
dp[2][1] = 3;
for (int i = 3; i <= 251; i++) {
for (int k = 1; k <= max(dp[i - 1][0], dp[i - 2][0]); k++) {//k表示第几位数,最大值为前两个的最大长度
dp[i][k] = dp[i - 1][k] + dp[i - 2][k] * 2;
}
dp[i][0] = max(dp[i - 1][0], dp[i - 2][0]);//共i列的情况下的长度暂时为该值
for (int k = 1; k <= dp[i][0]; k++) {//对每一位进行计算
if (dp[i][k] >= 10) {
dp[i][k + 1] += dp[i][k] / 10;
dp[i][k] %= 10;
}
}
if (dp[i][dp[i][0] + 1]) dp[i][0]++;//如果最高位+1有值的话,长度加一
}
int num;
while (cin >> num) {
if (num == 0) cout << "1" << endl;//特殊情况
else {
for (int i = dp[num][0]; i >= 1; i--) {//先从最高位开始输出
cout << dp[num][i];
}
cout << endl;
}
}
return 0;
}
感谢阅读!!!
“ Ctrl AC!一起 AC!”