24h購物| | PChome| 登入
2011-08-26 22:41:20| 人氣676| 回應0 | 上一篇 | 下一篇

b177. 山景 Skyline

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

b177. 山景 Skyline

內容 : | 正體中文 (zh_TW) | 簡體中文 (zh_CN)

一座山的山稜線由許多片段的45度斜坡構成,每一個片段不是上坡就是下坡。

          *
   *   *  /\
*  /\  /\/  \
/\/  \/      \

在我們眼前的所見的任何寬度為n個單位的山稜形狀,可以輕鬆地觀察到所有山頂的位置。

請問有多少種山稜線的形狀,使得所有山頂的位置由左而右非遞減呢?

所有的山稜線都必須完整,也就是說左右兩端都必須是高度為0的山腳,而且不能有任何山谷的位置隱沒在地平線底下。

輸入說明 :

輸入僅包含一個數字n,n一定會是偶數,因為會有相同片段數量的上坡以及下坡。

輸出說明 :

請輸出山頂位置由左而右非遞減的山稜線形狀總數。
由於答案可能很大,你只要輸出以十進位表示時,它的最後9位數即可。

範例輸入 :

6

範例輸出 :

4

提示 :

佔總分20%的測試數據中 n<=60
佔總分40%的測試數據中 n<=200
佔總分100%的測試數據中 n<=3000

出處 :

CSAPC'08 Problem Setter: Tmt, Seanwu (管理:tmt514)



作法 : DP
我承認我是來亂的

/**********************************************************************************/
/*  Problem: b177 "山景 Skyline" from CSAPC'08 Problem Setter: Tmt, Seanwu      */
/*  Language: C                                                                   */
/*  Result: AC (38ms, 17407KB) on ZeroJudge                                       */
/*  Author: morris1028 at 2011-08-26 14:47:10                                     */
/**********************************************************************************/


#include<stdio.h>
#define limit 1500
#define Mod 1000000000
long long DP[1501][1501] = {}, Ans[1501] = {};
long long Sum[1501] = {};
main() {
    int a, b, c, d;
    DP[0][0] = 1;
    for(a = 1; a <= limit; a++) {
        for(b = 1; b <= a; b++) {
            DP[a][b] = (DP[a-1][b-1] + Sum[b])%Mod;
            Sum[b] = (Sum[b] - DP[a-b][b] + DP[a][b])%Mod;
            Ans[a] = (Ans[a] + DP[a][b])%Mod;
        }
    }
    int n;
    while(scanf("%d", &n) == 1) {
        n /= 2;
        if(n >= 48)
            printf("%09lld\n", Ans[n]);
        else
            printf("%lld\n", Ans[n]);
    }
    return 0;
}

台長: Morris
人氣(676) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 資訊競賽 |
此分類下一篇:b217. 2. 線串式主題閱讀系統
此分類上一篇:d429. 第一題: 社團分組 (club)

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