Codeforces 1152D(dp)
原创
©著作权归作者所有:来自51CTO博客作者暂为菊内人的原创作品,请联系作者获取转载授权,否则将追究法律责任
要点
- 寻找最多边的匹配的结论:贪心地从叶子开始找,最后答案都是奇数层下边的那条边。
- 设\(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);
}