Codeforces 1152D(dp)

要点

  • 寻找最多边的匹配的结论:贪心地从叶子开始找,最后答案都是奇数层下边的那条边。
  • \(dp[i][j]\)表示当前长度为\(i\),平衡度为\(j\),平衡度为(数量减去)数量。
  • 增加左右括号转移,并将奇数层合法的加到ans中。
#include <cstdio>

const int maxn = 1005, mod = 1e9 + 7;
int n;
long long dp[maxn << 1][maxn << 1], ans;

int main() {
    scanf("%d", &n);
    dp[0][0] = 1;
    for (int i = 0; i < 2 * n; i++) {
        for (int j = 0; j <= i; j++) {
            dp[i + 1][j + 1] = (dp[i + 1][j + 1] + dp[i][j]) % mod;
            if (j)  dp[i + 1][j - 1] = (dp[i + 1][j - 1] + dp[i][j]) % mod;
        }
        if (i % 2) {
            for (int j = 0; j <= i && i + j <= 2 * n; j++)
                ans = (ans + dp[i][j]) % mod;
        }
    }
    return !printf("%lld\n", ans);
}

猜你喜欢

转载自www.cnblogs.com/AlphaWA/p/10823103.html