一看就是一个递推的题目,自己推了一会儿,推出来一个递推公式,有点搓
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