zoukankan      html  css  js  c++  java
  • FZU 2098 刻苦的小芳

    这个问题转化一下就是求长度为2*n的正确括号匹配串,两个匹配的括号之间的距离不超过2*k的有几种。

    假设左括号为1,右括号为-1,dp[i][j]表示长度为i的括号匹配串,前缀和为j的有几种。dp[2*n][0]就是答案。

    递推式:

    if (j + 1 <= k) dp[i][j] = (dp[i][j] + dp[i - 1][j + 1]) % MOD;
    if (j - 1 >= 0) dp[i][j] = (dp[i][j] + dp[i - 1][j - 1]) % MOD;

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    const int MOD=1e9+7;
    int n,k;
    int dp[210][105];
    
    void init()
    {
        memset(dp,0,sizeof dp);
        dp[0][0] = 1;
        for (int i = 1; i <= 2*n; i++)
        {
            for (int j = 0; j <= k; j++)
            {
                if (j + 1 <= k) dp[i][j] = (dp[i][j] + dp[i - 1][j + 1]) % MOD;
                if (j - 1 >= 0) dp[i][j] = (dp[i][j] + dp[i - 1][j - 1]) % MOD;
            }
        }
    }
    
    int main()
    {
        int R=1;
        while(~scanf("%d%d",&n,&k))
        {
            init();
            printf("Case %d: %d
    ",R++,dp[2*n][0]);
        }
    
        return 0;
    }
  • 相关阅读:
    Trie树
    递归函数两种方式的区别
    揭开HTTPS的神秘面纱
    补码到底是个什么东西
    浮点数的运算精度丢失
    PHP的stdClass
    2019-10-24
    MySQL存储引擎
    代码整洁之道小结
    NFS4 挂载同主机多个目录
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5282000.html
Copyright © 2011-2022 走看看