一看就是一个递推的题目,自己推了一会儿,推出来一个递推公式,有点搓
F[i][j],表示的是第一个的楼梯高度是i的情况下,用j块积木的堆积方案
结果发现好像要用O(n^3)的时间复杂度才能解决,不过好在这个递推公式对了
但是怎么都WA,自己验证了几组比较小的数据,都对了
然后只能去Google一下,后来发现有个人说,这道题目有大数陷阱,用double就过了
一试,没过-_-!!!,怀疑自己的地推公式对不对……
后来想了想,是不是我的输出有问题,原来是cout << sum <<endl;
改成了printf("%0.0lf\n",sum);
AC了,很神奇……
为什么在我自己的电脑上面,运算出来的结果显示的都是整数呢……,非得用个0.0lf这种东西才能过
看来还是对gcc不了解……
1 #include <iostream>
2
3 using namespace std;
4
5 double F[505][505];
6
7 int main()
8 {
9
10 for (int i = 1; i < 505; i++)
11 for (int j = 1; j < 505; j++)
12 {
13 if (i!=j)
14 F[i][j] = 0;
15 else
16 F[i][j] = 1;
17 }
18
19 for (int i = 3; i < 505; i++)
20 for (int j = 1; j <= (i-1)/2; j++)
21 for (int k = j + 1; k <= i - 1; k++)
22 F[j][i] += F[k][i-j];
23
24 int N;
25 while (cin >> N && N!=0)
26 {
27 double sum = 0.0;
28 for (int i = 1; i <= (N-1)/2;i++)
29 sum+=F[i][N];
30 printf("%0.0lf\n",sum);
31 }
32
33 return 0;
34 }
35