HDU 1297(Children’s Queue)

递推和大数加法,设 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;
}

继续加油。

上一篇:进制转换


下一篇:一个没有'0'的计数