1. 程式人生 > >從《程式設計之美》買票找零問題說起,娓娓道來卡特蘭數——兼爬坑指南

從《程式設計之美》買票找零問題說起,娓娓道來卡特蘭數——兼爬坑指南

#include <stdio.h>
#include <stdlib.h>
#define MAXN 36
unsigned long long catalan(unsigned long long *array,int n) {
    static int MaxIndex = -1;
    if(n<=MaxIndex)
        return array[n];
    if(MaxIndex == -1){ //haven't been initialized.
        array[0] = 1;
        MaxIndex 
= 0; } //for calculating C[n] with C[0],...,C[n-1] //there are C[0],...,C[MaxIndex] while(MaxIndex<n) { int i; MaxIndex++; array[MaxIndex] = 0; for(i=0;i<MaxIndex;i++) array[MaxIndex] += array[i] * array[MaxIndex-1-i]; } return
array[MaxIndex]; } int main() { int n; unsigned long long *array; array = malloc((MAXN+1) * sizeof(unsigned long long)); while(1) { scanf("%d",&n); if(n<0) { printf("[error]negative number.\n"); return -1; }
else if(n>=MAXN) { printf("[error]larger than 35.\nan unsigned long long can't store it.\n"); return -1; } printf("C%d %lld\n",n,catalan(array,n)); } }

相關推薦

程式設計問題說娓娓道來——指南

#include <stdio.h> #include <stdlib.h> #define MAXN 36 unsigned long long catalan(unsigned long long *array,int n) { static int MaxIn

[程式設計]()

第一次看這題的時候沒有好好注意,後來發現這是一類大問題,學習了卡特蘭數這個概念,順便又複習了高中的排列組合知識、、、 一、書中問題 先看一下書中引入卡特蘭數的例子: 《程式設計之美》4.3買票找零:2n個人排隊買票,其中n個人持50元,n個人持1

程式設計4.3

題目描述: 假設有2N個人在排隊買票,其中有N個人手持50元的鈔票,另外有N個人手持100元的鈔票,假設開始售票時,售票處沒有零錢,問這2N個人有多少種排隊方式,不至使售票處出現找不開錢的局面? 題目分析: 這題時典型的卡特蘭數(Cartalan)問題 Ca

程式設計4.3

解法二的筆記: 存在某個k,使序列前k項中1的個數比0的個數剛好小1? 假設不存在這樣的k,那麼由於是非法序列那麼k=2n-1時,1的個數至少比0小於2,這樣無論第2n個數取0還是取1,0和1的總個數均不會相等,所以假設不成立。 必存在k使序列前k項中1的個數比0的個數剛

程式設計 書問題java

import java.util.Comparator; public class MaiBook { public static float minCost(Integer[]num){ float c5=Float.MAX_VALUE,c4=Float.MA

4.3

《程式設計之美》中提到了“買票找零”問題,查閱了下資料,此問題和卡特蘭數 Cn有關,其定義如下: 卡特蘭數真是一個神奇的數字,很多組合問題的數量都和它有關係,例如: Cn= 長度為 2n的 Dyck words的數量。 Dyck words是由 n個 X和 n個 Y組成的

程式設計1:CPU列印直線曲線

原創:https://blog.csdn.net/ndzjx/article/details/84404268 1:本質:每次迴圈的CPU比例問題。 CPU排程時間片,大約為20ms 2.2GHz是CPU時鐘週期,= 22億次 = 2.2*10^9 每個時鐘週期平均執行2條彙編指令

程式設計:連結串列有環如何判斷相交

如果兩個連結串列無換,判斷是否相交很簡單,判斷兩個環的最後一個節點指標是否相等即可。 題目描述:上面的問題都是針對連結串列無環的,那麼如果現在,連結串列是有環的呢?上面的方法還同樣有效麼? 分析

NOIP 衝刺:常見的遞推

例題: 在一個凸n邊形中,通過不相交於n邊形內部的對角線,把n邊形拆分成若干三角形,問有多少種拆分方案。 啊啊啊啊 卡特蘭數 卡特蘭數又稱卡塔蘭數,卡特蘭數是組合數學中一個常出現在各種計數問題中的數列。以比利時的數學家歐仁·查理·卡塔蘭 (1814–1

[BZOJ4001][TJOI2015]概率論(+規律)

Address Solution 眾所周知, nn 個節點,兩兩不同構的二叉樹的數量為 Catalan(n)Catalan(n) 。 其中 Catalan(n)Catalan(n) 為卡特蘭數,即 Cn2n−Cn−12n=Cn2nn+1C2nn−C

應用--n個元素的出棧順序與(0,0)到(n,n)不穿過對角線的方法

1.出棧順序方法數: hdoj1023 求出棧序列,比如1,2,3,出棧序列為3 2 1,1 2 3,1 3 2,2 1 3,2 3 1,一共5種 第一種思路: 我們把入棧看做1,出棧看做0,那麼入棧

程式設計-1.4-書問題

問題描述: 《哈利波特》1-5卷促銷活動,每本8元。買不同的n本可以對應不同的折扣如下。 求解一筆訂單中,購買不同卷數不同本數的最少價格解。 問題思考: 書中給出了兩種解題思路: 思路一: 參照上一小節,仍使用遞迴方式遍歷所有解,取得最優解。 思路二: 採用貪

程式設計》1.4書問題的常數時間解法

優秀書籍某出版社的《哈里波特》系列共有5卷,每本單賣都是8塊錢,如果讀者一次購買不同的k(k>=2)卷,就可以享受不同的折扣優惠,如下所示:求,如果買一批書的最低價格,即最大折扣符號說明:按照書上

程式設計》1.4 書問題 貪心法則

在書中,作者分析兩種解法 解法一是貪心,最後得到的結論是:貪心不成立 解法二是dp , 也類似於遞迴,最後是成立的 在這裡我們重點分析貪心法不成立的原因,以及如何改進 貪心法的適用有兩個必要條件,即

程式設計——一摞烙餅的排序(暴搜+剪枝)

題目 分析 深度優先搜尋遍歷每一種情況,去翻轉次數最小的,當然,還要加一些剪枝,畢竟O(nn)的時間複雜度。 程式碼 C風格 1 /**** 字首排序 ****/ 2 #include<stdio.h> 3 #include<cstring> 4 #incl

程式設計10:計算字串的相似度

我們並不在乎兩個字串變得相等之後的字串是怎樣的,所以 1.一步操作之後,再將A[2,…,lenA]和B[1,…,lenB]變成相同的字串。 2.一步操作之後,再將A[1,…,lenA]和B[2,…,lenB]變成相同的字串。 3.一步操作之後,再將A[2,…,lenA]和B[2,…,lenB]變成相

程式設計9:陣列迴圈位移

1: RightShift(int *arr, int N, int K) { K %= N; while (K--) { int t = arr[N - 1]; for (int i = N - 1; i > 0; i--)

程式設計8:求陣列的子陣列之和的最大值

1: int MaxSum(int *A, int n) { int maximum = -INF; int sum; for (int i = 0; i < n; i++) { sum = 0; for (int j = i;

程式設計7:最大公約數

1:輾轉相除法 f(x,y) = f(y, x%y); int gcd(int x, int y) { return (!y) ? x : gcd(y, x % y); } 2:對於大整數,取模運算非常昂貴。 f(x, y) = f(x-y, y); BigInt gcd(BigI

程式設計3:求二進位制中1的個數

1: int Count(BYTE v) { int num = 0; while (v) { if (v % 2 == 1) { num++; } v = v / 2; }