#17019: 遞迴 vs DP


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
d859. NOIP2001 1.数的计算 -- NOIP2001普及组第一题 | From: [27.52.9.157] | 發表日期 : 2019-02-28 22:32

這題因為 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 ] 即是答案

 
ZeroJudge Forum