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