hdu 1133很無語的題

2021-07-03 02:17:00 字數 1384 閱讀 4149

其實思路很簡單,就是幾個函式實現幾個功能。

對於每乙個數來說,必須進棧一次、出棧一次。我們把

進棧設為狀態『1』,出棧設為狀態『0』。n個數的所有狀態對應n個1和n個0組成的2n位

二進位制數。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於

出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃瞄由n個1和n個0組成的2n位二進位制數,1的累計數不小於0的累計數的方案種數。

在2n位二進位制數中填入n個1的方案數為c(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃瞄,0的累計數大於1的累計數)的方案數即為所求。

不符合要求的數的特徵是由左而右掃瞄時,必然在某一奇數字2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n+1個0和n-1個1組成的排列。

反過來,任何乙個由n+1個0和n-1個1組成的2n位

二進位制數,由於0的個數多2個,2n為

偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應乙個不符合要求的數。

因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。

顯然,不符合要求的方案數為c(2n,n+1)。由此得出輸出序列的總數目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)=h(n)。

簡單來說,就是判斷後實現(m+n)*(m-n+1)/(m+1);

#include #include using namespace std;

#define max 100

#define base 10000

void multiply(int a,int max,int b) //大數乘小數

}void divide(int a, int max, int b) //大數除小數

memcpy ( res , fact[m+n] , max * sizeof ( int ) ); //階乘 ( m + n )!

multiply ( res, max, m - n + 1 ); // ( m + n )! * ( m-n+1 )

divide ( res, max, m + 1 ); // ( m + n )! * ( m-n+1 ) / ( m+ 1 )

output ( res );

}return 0;

}

不過很奇怪的是進製(base)必須要在5和9之間才能ac,試了很多遍,太鬱悶了!



HDU1133題解 遞推做法

m和n個人去買票,m個人有50元,n個人有100元,問有多少種買票的方式。這道題做之前完全不知道卡特蘭數是什麼東西,自己寫了個大數dp過了,先說下那個思路。void solve bigaddbig dp j i j dp j 1 i j dp j i j 1 dp i j 意為i個50元的,j個10...

catalan數的應用 變形 HDU1133

檢視維基百科,對卡特蘭數公式證明是這樣的 令1表示進棧,0表示出棧,則可轉化為求乙個2n位 含n個1 n個0的二進位制數,滿足從左往右掃瞄到任意一位時,經過的0數不多於1數。顯然含n個1 n個0的2n位二進位制數共有 考慮乙個含n個1 n個0的2n位二進位制數,掃瞄到第2m 1位上時有m 1個0和m...

專案做的很無語

最近幾個月很忙,今天上來一看,11月份一篇部落格都沒有,好歹隨便寫一篇,湊個數。最近真的很忙,專案從4月份開始,預計12月份結束。從將近20的開發人員到現在5個開發人員,人員都抽走做其他事了。搞的現在測試階段每個人都要對應很多功能,真擔心改出一堆新的bug,無語。本來我是不參與具體編碼的,最多寫一些...