时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:839

解决:179

题目描述:
给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配;所有的右括号都有唯一的左括号匹配。例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是。
需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数。
输入:
测试数据包括多个,每个测试数据包含两行:
第一行为一个整数N,其中N不会超过10^6。
第二行为一个长度为N的字符串,这个字符串由左括号'('和右括号')'组成。
输出:
对应每个测试案例,输出一行,其中包含两个整数,分别代表最长合法括号序列的长度和个数,中间由空格隔开。若没有合法的子序列存在,则返回0 1。
样例输入:
6
(())()
3
))(
样例输出:
6 1
0 1

思路:

目前自己还没做出来,先上别人写的代码,过段时间会更新成自己写的代码。

别人算法的分析:

         红色区域表示已经得到的合法括号序列。

         如上图,分别计算以第i个符号为结尾的最长合法括号序列长度,保存在maxLen[i]中

         在位置pos时,如果该位置为‘(’,显然maxLen[pos]=0;

         如果该位置为')',  我们已经得到了pos-1位置的最长合法括号序列,我们判断以pos-1
位置为结尾的最长合法括号序列的左边位置sympos上的符号是否为'(', 

        如果sympos位置上为‘(’,如图中第2步所示,则以Pos为结尾的最长合法括号序列是以pos-1位置为结果的最长合法括号序列加上sympos上的符号‘(’和pos上的符号‘)’而成,如图第3步。

         接下来还要再加上以sympos-1为结尾的最长合法括号序列,构成最终的合法括号序列。如图第4步。

另外一个 最长合法括号序列题,不过解决算法相差很大 。九度笔记之
1342:寻找最长合法括号序列II

代码:

#include <iostream>
#include <string>
using namespace std;
void getMaxLen(std::string &s){
std::string::size_type len = s.size();
std::string::size_type pos = 0;
int *maxLen = new int[len]; //maxLen end at pos
maxLen[0] = 0;
int ml = 0;
int ns = 0;
for(pos = 1;pos<len;pos++){
if(s.at(pos)=='(' )
maxLen[pos]=0;
else{
int sympos = pos-1 - maxLen[pos-1];//can't use size_type becase it's unsigned if
//pos-1 < maxLen[pos-1] sympos will be 0xffffffff
if(sympos<0 || s.at(sympos)==')'){
maxLen[pos]=0;
}else{
maxLen[pos] = maxLen[pos-1]+2;// add () before
if(sympos>0){
maxLen[pos]+=maxLen[sympos-1];
} if(maxLen[pos]>ml){
ml = maxLen[pos];
ns = 1;
}else if(maxLen[pos]==ml){
ns++;
}
}
}// else if(s.at(pos)=='(')
}//for
if(ml>0)
std::cout<<ml<<" "<<ns<<std::endl;
else
std::cout<<0<<" "<<1<<std::endl;
} void judo(){
int n;
std::string s;
while(std::cin>>n>>s){
getMaxLen(s);
}
}
void test(){
std::string s= "())";
getMaxLen(s);
}
int main() {
//test();
judo();
//cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
/**************************************************************
Problem: 1337
User: KES
Language: C++
Result: Accepted
Time:300 ms
Memory:6452 kb
****************************************************************/

         红色区域表示已经得到的合法括号序列。

         如上图,分别计算以第i个符号为结尾的最长合法括号序列长度,保存在maxLen[i]中

         在位置pos时,如果该位置为‘(’,显然maxLen[pos]=0;

         如果该位置为')',  我们已经得到了pos-1位置的最长合法括号序列,我们判断以pos-1
位置为结尾的最长合法括号序列的左边位置sympos上的符号是否为'(', 

        如果sympos位置上为‘(’,如图中第2步所示,则以Pos为结尾的最长合法括号序列是以pos-1位置为结果的最长合法括号序列加上sympos上的符号‘(’和pos上的符号‘)’而成,如图第3步。

         接下来还要再加上以sympos-1为结尾的最长合法括号序列,构成最终的合法括号序列。如图第4步。

另外一个 最长合法括号序列题,不过解决算法相差很大 。九度笔记之
1342:寻找最长合法括号序列II

九度OJ 1337:寻找最长合法括号序列 (DP)的更多相关文章

  1. 九度oj题目1342:寻找最长合法括号序列II

    题目1342:寻找最长合法括号序列II(25分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:886 解决:361 题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然 ...

  2. 九度oj 题目1337:寻找最长合法括号序列

    题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...

  3. 九度OJ 1342:寻找最长合法括号序列II (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...

  4. 九度oj 题目1342:寻找最长合法括号序列II

    题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ...

  5. [Jobdu] 题目1337:寻找最长合法括号序列

    题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...

  6. 九度OJ 1214 寻找丑数【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1214 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因 ...

  7. 九度oj 1034 寻找大富翁 2009年浙江大学计算机及软件工程研究生机试真题

    题目1034:寻找大富翁 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5323 解决:2123 题目描述:     浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. 输入:     ...

  8. 九度OJ 1195:最长&最短文本 (搜索)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3144 解决:1156 题目描述: 输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输 ...

  9. 九度oj 题目1357:疯狂地Jobdu序列

    题目描述: 阳仔作为OJ的数据管理员,每一周的题目录入都让其很抓狂,因为题目不是他出的,他控制不了出题的速度……在等题目的时候,阳仔又不敢出去打篮球,所以只能在纸上乱涂乱写,这天,阳仔在纸上写下了这样 ...

随机推荐

  1. jconsole使用记录

    jconsole/JVisualVM连接linux服务器查看JVM使用情况 现需要在本地电脑上查看服务器的tomcat的整体的运行状态,使用jconsole工具. JMX配置 拷贝$JAVA_HOME ...

  2. zabbix自动化监控之自动注册

    自动注册与自动发现刚好相反,是zabbix agent主动联系zabbix server,最后由zabbix server将这些agent加到host里.活动的Zabbix agent可以自动注册到服 ...

  3. SQL注入的几种有用办法

    一.查询表中包括有多少列: 这里以DISCUZ举例说明,例如以下 select * FROM pre_forum_thread ORDER BY 80 返回,Unknown column '80' i ...

  4. elasticsearch 基本用法

    最大的特点: 1. 数据库的 database, 就是  index 2. 数据库的 table,  就是 tag 3. 不要使用browser, 使用curl来进行客户端操作.  否则会出现 jav ...

  5. 通过Fsharp探索Enterprise Library Exception

    Exception怎么生成是一回事,怎么展示又是还有一回事了. Exception Block主要关注的点在于Exception信息的展示.Exception不同于一般的log信息,是系统设计者未考虑 ...

  6. Android中IntentService详解

    简单说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service ...

  7. TCP/IP详解 卷一(第十二章 广播和多播)

    广播和多播仅应用于UDP. 广播指的是一个主机向网上的所有其他主机发送帧,而 多播仅发送给属于多播组的多个主机. 为了弄清广播和多播,需要了解主机对由信道传送过来帧的过滤过程 1.首先,网卡查看由信道 ...

  8. 【Excle数据透视表】如何禁用数据透视表的总计行/列

    如上图:有行合计也有列合计.现在我们需要将行列合计都去除,如何操作呢? 解决办法一: 数据透视表区域任意单元格→数据透视表工具→设计→布局→总计→对行和列禁用 解决办法二: 数据透视表区域任意单元格→ ...

  9. 【Excle数据透视表】如何为一个字段添加多种分类汇总方式

    解决方案1 右键单击人员分类字段包含的任意单元格→右键→字段设置→自定义→(最大值.最小值) 解决方案2 单击人员分类→分析→字段设置

  10. ROS库生成和调用

      参考资料: 生成.so文件:http://blog.csdn.net/u013243710/article/details/35795841 调用.so文件:http://blog.csdn.ne ...