[hdu1023]递推

http://acm.hdu.edu.cn/showproblem.php?pid=1023

如果把栈里面的元素个数表示成状态,每一步(共2 * n步)的状态构成的状态序列的种数就是答案,令dp[i][j]表示第i步栈的状态为j的方案数,则有:

dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1],+1、-1相当于进栈和出栈,需考虑边界条件,详见代码(答案太大,需用大数):

  1 #include <iostream>

  2 #include <cstdio>

  3 #include <cstring>

  4 #include <cmath>

  5 #include <algorithm>

  6 #include <map>

  7 #include <stack>

  8 #include <string>

  9 #include <ctime>

 10 #include <queue>

 11 #define mem0(a) memset(a, 0, sizeof(a))

 12 #define mem(a, b) memset(a, b, sizeof(a))

 13 #define lson l, m, rt << 1

 14 #define rson m + 1, r, rt << 1 | 1

 15 #define eps 0.0000001

 16 #define lowbit(x) ((x) & -(x))

 17 #define memc(a, b) memcpy(a, b, sizeof(b))

 18 #define x_x(a) ((a) * (a))

 19 #define LL __int64

 20 #define DB double

 21 #define pi 3.14159265359

 22 #define MD 10000007

 23 #define INF (int)1e9

 24 using namespace std;

 25 struct BigNum{

 26         #define maxlen 10

 27         #define memc(a, b) memcpy(a, b, sizeof(b))

 28         #define mem0(a) memset(a, 0, sizeof(a))

 29         typedef __int64 Num[maxlen + 2];

 30         Num num;

 31         char s[maxlen + 2];

 32         BigNum operator+(BigNum num2) {

 33                 BigNum ans;

 34                 mem0(ans.num);

 35                 for(int i = 1; i <= maxlen; i++) {

 36                         ans.num[i] += num[i] + num2.num[i];

 37                         ans.num[i + 1] += ans.num[i] / (int)1e9;

 38                         ans.num[i] %= (int)1e9;

 39                 }

 40                 return ans;

 41         }

 42         BigNum operator*(BigNum num2) {

 43                 BigNum ans;

 44                 mem0(ans.num);

 45                 for(int i = 1; i <= maxlen; i++) {

 46                         for(int j = 1; j <= maxlen; j++) {

 47                                 if(i + j - 1 <= maxlen) {

 48                                         ans.num[i + j - 1] += num[i] * num2.num[j];

 49                                         ans.num[i + j] += ans.num[i + j - 1] / (int)1e9;

 50                                         ans.num[i + j - 1] %= (int)1e9;

 51                                 }

 52                         }

 53                 }

 54                 return ans;

 55         }

 56         void convert() {

 57                 int len = strlen(s), cnt = 0;

 58                 for(int i = len - 1; i >= 0; i -= 9) {

 59                         int p = 0, x = 0, t = 1;

 60                         while(i - p >= 0 && p < 9) {

 61                                 x += t * (s[i - p] - '0');

 62                                 p++;

 63                                 t *= 10;

 64                         }

 65                         num[++cnt] = x;

 66                 }

 67         }

 68         void inp() {

 69                 mem0(num);

 70                 scanf("%s", s);

 71                 convert();

 72         }

 73         void outp() {

 74                 int p = 1;

 75                 for(int i = maxlen; i >= 1; i--) {

 76                         if(num[i]) {

 77                                 p = i;

 78                                 break;

 79                         }

 80                 }

 81                 cout<< num[p];

 82                 while(--p) {

 83                         int a[9] = {0}, x = num[p];

 84                         for(int i = 0; i < 9; i++) {

 85                                 a[i] = x % 10;

 86                                 x /= 10;

 87                         }

 88                         for(int i = 8; i >= 0; i--) {

 89                                 printf("%d", a[i]);

 90                         }

 91                 }

 92         }

 93         BigNum(char str[]) {

 94                 strcpy(s, str);

 95                 mem0(num);

 96                 convert();

 97         }

 98         BigNum(){}

 99 };

100 BigNum f[220][120];

101 int main()

102 {

103         //freopen("input.txt", "r", stdin);

104         //freopen("output.txt", "w", stdout);

105         int n;

106         while(~scanf("%d", &n)) {

107                 mem0(f);

108                 f[0][0] = BigNum("1");

109                 for(int i = 1; i <= 2 * n; i++) {

110                         for(int j = 0; j <= n; j++) {

111                                 f[i][j] = f[i - 1][j + 1];

112                                 if(j) f[i][j] = f[i][j] + f[i - 1][j - 1];

113                         }

114                 }

115                 f[2 * n][0].outp();

116                 cout<< endl;

117         }

118         return 0;

119 }
View Code

 

你可能感兴趣的:(HDU)