递推和大数加法,设 f(n) 表示长度为 n 时的可能数,则递推公式为 f(n) = f(n-1) + f(n-2) + f(n-4),使用大数加法模板即可。
#include <iostream>
using namespace std;
const int MAXN = 1005;
int f[MAXN][MAXN];
//大数加法
void bigAdd()
{
f[1][0] = f[2][0] = f[3][0] = f[4][0] = 1; //每行第一个数表示该行数字的位数
f[1][1] = 1; f[2][1] = 2; f[3][1] = 4; f[4][1] = 7;
for (int i = 5; i < MAXN; i++)
{
int carry = 0; //进位
for (int j = 1; j <= f[i - 1][0]; j++)
{
f[i][j] = f[i - 1][j] + f[i - 2][j] + f[i - 4][j] + carry;
carry = f[i][j] / 10;
f[i][j] %= 10;
}
f[i][0] = f[i - 1][0];
while (carry > 0)
{
f[i][++f[i][0]] = carry % 10;
carry /= 10;
}
}
}
int main()
{
bigAdd();
int n;
while (cin >> n)
{
for (int i = f[n][0]; i > 0; i--)
cout << f[n][i];
cout << endl;
}
return 0;
}
继续加油。