一看就是一個遞推的題目,自己推了一會兒,推出來一個遞推公式,有點搓
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