24h購物| | PChome| 登入
2009-11-16 08:06:13| 人氣698| 回應0 | 上一篇 | 下一篇

CSAPC'09, Problem Setter CSAPC'09 聖誕禮物

推薦 0 收藏 0 轉貼0 訂閱站台

作法: 數學(DP)  //此題解法是上網搜到的

http://nccur.lib.nccu.edu.tw/bitstream/140.119/32573/7/75101807.pdf

這題公式跟(二元樹有N個節點能建多少不同的樹是很像的↑)
只是首項有些許的不同...在此由於也是猜出來的,所以其道理不做說明 =    =+

/**********************************************************/

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
main()
{
  int N;
  while(scanf("%d",&N)==1)
      {
         int a,b,SUM=0;
         long long DP[10001],k;
         DP[1]=1,DP[2]=2;
         for(a=3;a<=N;a++)
            {
            for(b=1,k=0;b<a;b++)
               k=(k+DP[b]*DP[a-b])%1000000000;
              DP[a]=(DP[a-1]+k)%1000000000;
            }
          printf("%I64d\n",DP[N]);
      }
  return 0;
}

精簡修正版↓

/***********************************************************/

#include<stdlib.h>
#include<stdio.h>
main()
{
  int N,a,b;
  while(scanf("%d",&N)==1)
      {
         long long DP[10001],k;
         DP[1]=1,DP[2]=2;
         for(a=3;a<=N;a++)
            {
              int n=a/2-(a%2==0);
              for(b=1,k=0;b<=n;b++)
                  k=(k+DP[b]*DP[a-b])%1000000000;
              k*=2,k%1000000000;
              if(a%2==0) k+=(DP[a/2]*DP[a/2]);
              DP[a]=(DP[a-1]+k)%1000000000;
            }
          printf("%I64d\n",DP[N]);
      }
  return 0;
}

台長: 來源不明
人氣(698) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: 資訊競賽 |
此分類下一篇:NOIP 2008 提高组 NOIP 2008 2.火柴棍等式
此分類上一篇:CSAPC'09, Problem Setter CSAPC'09 質均數

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文