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個100元的,此時的方案數,顯然dp[i][j]=dp[i-1][j]+dp[i][j-1]。但是要注意這樣求出來的最終的方案數實際上是把每個人看作相同的,也就是在求方案數的時候最終要*fac(i)*fac(i-1)。
#include
#define maxn 1000
using
namespace
std;
char fac[201][maxn];
char dp[201][201][1005];
char ans1[100005],ans2[1000005];
int n,m;
void bignummultismall(char *a, char *b, int mul)
, b_int[1000] = ;
len = strlen(b);
for (i = 0; i < len; i++)
b_int[i] = b[len - 1 - i] - '0';
for (i = 0; iif (a_int[i]>9)
}while (a_int[i])
while (a_int[i - 1] == 0)
i--;
for (j = 0; j < i; j++)
a[j] = a_int[i - j - 1] + '0';
a[j] = '\0';
}void bigmultibig(char *a, char *b, char *c)
, b_int[1000] = , c_int[1000] = ;
len1 = strlen(b);
for (i = len1 - 1; i >= 0; i--)
b_int[len1 - i - 1] = b[i] - '0';
len2 = strlen(c);
for (i = len2 - 1; i >= 0; i--)
c_int[len2 - i - 1] = c[i] - '0';
len = len1 + len2;
for (i = 0; i < len1; i++)
for (j = 0; j < len2; j++)
a_int[i + j] += b_int[i] * c_int[j];
for (i = 0; iif (a_int[i]>9)
while (a_int[len - 1] == 0)
len--;
for (i = 0; i < len; i++)
a[i] = a_int[len - i - 1] + '0';
a[i] = '\0';
if (strlen(a) == 0)
strcpy(a, "0");
}void bigaddbig(char *a, char *b, char *c)
, b_int[1005] = , c_int[1005] = ;
int len1, len2, len, i;
len1 = strlen(b);
len2 = strlen(c);
for (i = 0; i < len1; i++)
b_int[i] = b[len1 - 1 - i] - '0';
for (i = 0; i1 - i] - '0';
len = len1>len2 ? len1 : len2;
for (i = 0; iif (a_int[i]>9)
}if (a_int[i] != 0)
len++;
while (!a_int[len - 1])
len--;
for (i = 0; i < len; i++)
a[i] = a_int[len - 1 - i] + '0';
a[i] = '\0';
}void init()
}void solve()
bigaddbig(dp[j][i-j],dp[j-1][i-j],dp[j][i-j-1]);}}
}int main()
bigmultibig(ans1,fac[n],dp[n][m]);
bigmultibig(ans2,ans1,fac[m]);
printf("test #%d:\n",t++);
printf("%s\n",ans2);
}}
hdu 1133很無語的題
其實思路很簡單,就是幾個函式實現幾個功能。對於每乙個數來說,必須進棧一次 出棧一次。我們把 進棧設為狀態 1 出棧設為狀態 0 n個數的所有狀態對應n個1和n個0組成的2n位 二進位制數。由於等待入棧的運算元按照1 n的順序排列 入棧的運算元b大於等於 出棧的運算元a a b 因此輸出序列的總數目 ...
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...
卡特蘭數 hdu1130 hdu1133
題意 給定一棵n個節點的二叉樹,求這棵樹有多少個二叉樹。資料範圍 n 100 思路 n個節點的二叉樹有多種,多種二叉樹裡面又有子樹。當n到達100時,結果是乙個龐大的數字,所以要用到大數。在卡特蘭數的應用裡面,求二叉樹的個數是乙個典型的應用,還有 合法的入棧出棧序列數 多邊形分成三角形的個數 圓括弧...