标签:dp
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 6882 | Accepted: 3940 |
Description
Input
Output
Sample Input
1 20 31117532 0
Sample Output
X ((X)X(X))X (X(X(((X(X))X(X))X(X))))X(((X((X)X((X)X)))X)X)
Source
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 typedef __int64 ll; #define fre(i,a,b) for(i = a; i < b; i++) #define free(i,b,a) for(i = b; i >= a;i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define ssf(n) scanf("%s", n) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define bug pf("Hi\n") using namespace std; #define INF 0x3f3f3f3f #define N 20 int dp[N]; void inint() { int i,j; dp[0]=dp[1]=1; for(i=2;i<N;i++) { fre(j,0,i) dp[i]+=dp[j]*dp[i-1-j]; //i个节点的情况有列举左边放j,因为根节点需要一个,那么右边i-1-j } } void dfs(int n,int k) //n个节点,第k大 { if(n==1) //开始是k==1,一直错 { pf("X"); return ; } int i=0; for(i=0;;i++) if(dp[i]*dp[n-i-1]>=k) break; //左边有dp[i]种情况,右边有dp[n-i-1],因为有一个点当根节点 else k-=dp[i]*dp[n-i-1]; if(i) //左边有节点 { pf("("); dfs(i,(k-1)/dp[n-i-1]+1); pf(")"); } pf("X"); if(n-i-1) //右边有节点 { pf("("); dfs(n-1-i,(k-1)%dp[n-1-i]+1); pf(")"); } } int main() { int i,j,n; inint(); while(sf(n),n) { for(i=1;;i++) if(dp[i]>=n) break; //已经锁定i个节点是满足条件的 else n-=dp[i]; dfs(i,n); pf("\n"); } return 0; }
POJ 1095 Trees Made to Order(计数问题)
标签:dp
原文地址:http://blog.csdn.net/u014737310/article/details/45566277