這題因為 n 不大,用單純的遞迴就能 AC
以下是 C 的遞迴 :
int total=1; // 宣告在全域變數
void count(int n)
{
int i;
for(i=n/2;i>0;i--)
{
total++;
count(i);
}
}
原理 : n 本身有 1 種方法,n 前面可接上 n / 2 ~ 1 的數
接上 1 個數字後方法數 +1,並且以接上的數為基準再接下一個數字
亦即進入遞迴重複剛剛動作
此方法重複太多相同動作,因此適合用動態規劃 DP
以 6 為例,6 前面可接 1、2、3,1 的方法數 = 1,2 的方法數 = 2,3 的方法數 = 2
( 此方法數,指題目所說的生成數字總個數 )
因此 6 的方法數 = 1 + ( 1 + 2 + 2 ) = 6,也就是 1 + ( 1 ~ 3 的方法數)
此外因為題目條件,若 n 是偶數,則 n 與 n+1 方法數相同,因此只處理偶數情形即可
宣告陣列 int count [ 1002 ] ,用迴圈跑
若 i 是偶數,則 count [ i ] = count [ 1 ] + count [ 2 ] + ...... + count [ i / 2 ]
且 count [ i + 1 ] = count [ i ]
讀入測資 n ,直接輸出 count [ n ] 即是答案