Codeforces 1152D DP
题意:有一颗由长度为2 * n的合法的括号序列构成的字典树,现在你需要在这颗字典树上选择一些不连接的边,问最多可以选择多少条边?
思路:不考虑题目条件的话,我们只考虑在随意的一棵树上选择边,这是一个贪心的问题,只需要每次选择叶子结点和它的父亲这条边,然后把它和它父亲节点删除就可以了,不断进行这个操作,就可以得到最终的答案。但是题目中的这颗字典树的规模是非常大的,不能用正常的方法。我们发现这颗字典树有2个性质:
1:这颗字典树的所有叶子结点都在同一层。
2:有很多的子树是重复的。
通过第一个性质以及贪心算法,我们知道答案相当于是计算奇数层的点的个数(如果根按第0层开始算),从第2n层开始选择,因为2n层节点个数一定大于等于第2n - 1层,所以可以选择的最多的边数是2n - 1层的节点数,2n - 2层同理。
那么问题就转化为的求这颗字典树的奇数层的节点的个数了。
现在我们需要用到第二个性质,在这颗字典树中,容易发现,有些树的转移是相同的,我们假设用i(当前填充的括号数)和j(平衡因子)来表示一个状态,那么它只可能转移到dp[i + 1][j + 1]或者dp[i + 1][j - 1], 对应的转移是加一个右括号和加一个左括号,而i同时还等于深度,所以我可以用dp[i][j]表示深度为i,平衡因子是j的节点的个数,这样就可以O(n ^ 2)转移了。
代码:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod = 1000000007;
const int maxn = 2010;
int dp[maxn][maxn];
int main() {
int n;
scanf("%d", &n);
dp[0][0] = 1;
LL ans = 0;
for (int i = 1; i <= 2 * n; i++) {
for (int j = 0; j <= i; j++) {
if(j > 0) dp[i][j] = (dp[i][j] + dp[i - 1][j - 1]) % mod;
dp[i][j] = (dp[i][j] + dp[i - 1][j + 1]) % mod;
if(i % 2 == 1 && (i - j) % 2 == 0 && 2 * n - i >= j)
ans = (ans + dp[i][j]) % mod;
}
}
printf("%lld\n", ans);
}
Codeforces 1152D DP的更多相关文章
- codeforces#1152D. Neko and Aki's Prank(dp)
题目链接: https://codeforces.com/contest/1152/problem/D 题意: 给出一个$n$,然后在匹配树上染色边,每个结点的所有相邻边只能被染色一次. 问,这颗树上 ...
- Neko and Aki's Prank CodeForces - 1152D (括号序列,dp)
大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化 ...
- Codeforces 1152D(dp)
要点 寻找最多边的匹配的结论:贪心地从叶子开始找,最后答案都是奇数层下边的那条边. 设\(dp[i][j]\)表示当前长度为\(i\),平衡度为\(j\),平衡度为(数量减去)数量. 增加左右括号转移 ...
- Two Melodies CodeForces - 813D (DP,技巧)
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...
- Consecutive Subsequence CodeForces - 977F(dp)
Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
- CodeForces 1152D Neko and Aki's Prank
说明 Catalan(i) 表示卡特兰数的第 i 项. 题目链接:http://codeforces.com/problemset/problem/1152/C 题目大意 有 n 个左括号和 n 个右 ...
- Codeforces 721C [dp][拓扑排序]
/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...
- CodeForces 607C (DP) Hard problem
题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...
随机推荐
- python图像特征提取
这里使用的是python 3.5 .opencv_python-3.4.0+contrib,特征提取的代码如下: import cv2 img = cv2.imread("feature.j ...
- dubbo-源码阅读之Filter实现原理
最近完成一个需求,使用阿里Arms需要在log里面加上traceId,但是发现dubbo异常 被ExceptionFilter捕获 并打印 打印不出traceI,然后百度搜索如何重写Filter 参 ...
- AtCoder Grand Contest 001F Wide Swap
解法参考这位大佬的:https://www.cnblogs.com/BearChild/p/7895719.html 因为原来的数组不好做于是我们想反过来数组,根据交换条件:值相邻且位置差大于等于k, ...
- js中如何避免动态引入重复资源
创建存储数据的数组或者对象: 每次调用方法的时候,往里面添加资源对象,包括路径: 每次调用的时候遍历此路劲是否存在,如存在,就调用此资源对象的promise进行操作. 可避免资源未加载完成就执行的情况 ...
- Java Http POST/GET 情求
POST: //返回体 public static final String RESPONCE_BODY = "responceBody"; //URL public static ...
- C#接口的作用实例解析
一.接口的作用: 我们定义一个接口: public interface IBark { void Bark(); } 1. 再定义一个类,继承于IBark,并且必需实现其中的Bark()方法 pub ...
- PHP ftp_cdup() 函数
定义和用法 ftp_cdup() 函数把当前目录改变为 FTP 服务器上的父目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_cdup(ftp_connection ...
- 网格图必经点+dfs——cf1214D
先正着走一次把所有可行路径标记出来,然后倒着走两条路径,一条是能向下就向下的路径,另一条能向右就向右. 如果这两条路径相交,那么(1,1)-(n,m)路径上比有个必经点,把这个必经点封上,答案是1,如 ...
- [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...
- XSS漏洞的渗透利用另类玩法
XSS漏洞的渗透利用另类玩法 2017-08-08 18:20程序设计/微软/手机 作者:色豹 i春秋社区 今天就来讲一下大家都熟悉的 xss漏洞的渗透利用.相信大家对xss已经很熟悉了,但是很多安全 ...