TOPCODER SAM 686 div1 300
// TOPCODER SAM 686 div1 300
Problem Statement
带有小中括号的括号序列,问可以去掉多少子串,使得剩下的非空串是合法的。
Constraints
字符串长度不超过 40。
Examples
// ans[i] = count(s[i])
string s[] = {"()[]", "())", "()()", "([)]", "())[]][]([]()]]()]]]"};
int ans[] = {3, 2, 4, 2, 3854};
Solution
寻找反面,等价于有多少非空的子串是合法的。这是一个区间 dp,不难转移。
Code
#include <string.h>
#include <string>
const int N = 123;
class BracketSequenceDiv1
{
int n;
char str[N];
long long dp[N][N];
public:
long long count(std::string std_str)
{
n = std_str.size();
for (int i = 1; i <= n; ++i) {
str[i] = std_str[i-1];
}
memset(dp, 0, sizeof(dp));
return count(n);
}
long long count(int n)
{
for (int d = 1; d <= n; ++d) {
for (int i = 1; i + d - 1 <= n; ++i) {
int j = i + d - 1;
dp[i][j] = dp[i][j-1];
if (str[j] == ')') {
for (int k = i; k < j; ++k) {
// dp[i k-1] ( dp[k+1, j-1] )
if (str[k] == '(') {
dp[i][j] += (dp[i][k-1] + 1) * (dp[k+1][j-1] + 1);
}
}
}
else if (str[j] == ']') {
for (int k = i; k < j; ++k) {
// dp[i, k-1] [ dp[k+1, j-1] ]
if (str[k] == '[') {
dp[i][j] += (dp[i][k-1] + 1) * (dp[k+1][j-1] + 1);
}
}
}
}
}
return dp[1][n];
}
};
转载于:https://www.cnblogs.com/gu-castle/p/5536315.html
TOPCODER SAM 686 div1 300相关推荐
- topcoder srm 686 div1 -3
1.给出只包含'(',')','[',']'的字符串$s$,删除一些字符,使得剩下的是合法的括号.有多少种删除方法? $|s|\leq 40$ 思路:左括号和右括号较少的一种不会大于20.假设左括号少 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 691 div1 -3
1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...
- topcoder srm 706 div1
1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...
- topcoder srm 694 div1 -3
1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...
- topcoder srm 330 div1
problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...
- topcoder srm 360 div1
problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...
- topcoder srm 635 div1
problem1 link 首先枚举长度$L$.然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字.然后不同段就可以比较他们的关键字,一样就是可以转化的. p ...
- topcoder srm 495 div1
problem1 link 从前向后确定一下,然后再从后向前确定一下.一样的话就是可以确定的. problem2 link 首先将强连通分量缩点.理论上来说,只需要遍历所有入度为0的联通块中的一个即可 ...
最新文章
- 在哪里能收到python实例代码-Python找出最小的K个数实例代码
- Python——文件操作详解
- jQuery之表格变色
- oracle创建函数语句,Oracle 创建函数与存储过程语句积累
- EditPlus软件自动补全文档htmlbar.acp设置 及 模板文件格式
- L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT
- python selenium在编写过程中遇到的问题记录
- 苹果Mac 3D 建模渲染软件:Vectorworks
- JAVA8十大新特性详解
- 曲线平滑算法 matlab,matlab学习之降噪平滑算法
- 随机抽样方法——DataFrame.sample()
- (转)Silverlight 巧用文件生成时间强制客户端载入最新xap文件
- openstack中 Server Error for url: http://controller:9696/v2.0/agents, Internal Server Error
- 【随笔】记录一次简易的液位报警器的拆机修理
- 手机的开发者选项怎么找(真机调试)
- Win10下如何找到下载的主题壁纸,并提取图片
- 2021年起重机司机(限桥式起重机)免费试题及起重机司机(限桥式起重机)试题及解析
- 用c语言交通信号灯论文,plc交通信号灯毕业论文.doc
- python抽取某个时间段的数据_python 批量提取excel 指定时间段的数据
- HTML静态网页作业——关于我的家乡介绍安庆景点