【算法?日更?第八期】区间动态规划:1572:括号配对题解

  废话不多说,直接上题:



  题目测评链接:戳这里

  其实什么GBE都没用,小编最开始看了半天不懂,看了看别人的博客才知道这段话没什么用处。其实就是给一段字符串,判断是否括号是配对的。

  这道题一看就会想到区间动态规划(不会戳这里临时补一补),最开始先老老实实地写了一遍区间动态规划,后来觉得用栈也可以,于是写了一遍,代码如下:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<stack>
 4 using namespace std;
 5 string s;int n,wrong;
 6 stack<int>a;
 7 int main()
 8 {
 9     cin>>s;
10     n=s.length();
11     for(int i=0;i<n;i++)
12     {
13         if(s[i]==‘(‘) a.push(1);
14         else if(s[i]==‘)‘)
15         {
16             if(!a.empty())
17             {
18                 if(a.top()==1) a.pop();
19                 else wrong++;
20             }
21             else wrong++;
22         }
23         else if(s[i]==‘[‘) a.push(2);
24         else if(s[i]==‘]‘)
25         {
26             if(!a.empty())
27             {
28                 if(a.top()==2) a.pop();
29                 else wrong++;
30             }
31             else wrong++;
32         }
33     }
34     cout<<wrong;
35     return 0;
36 }

  想法很简单,检测到)或 ] 时,就判断是否能配对,如果不行,就记录下这个错误。

  样例很快就过了,但是测评时错了4个测试点,检查了一下,才发现了一些bug,比如输入([)]期望得到4,而只得到了1。所以还是老老实实用区间动态规划吧。

  首先思考一个问题:需要补上的括号数=没有成功配对的括号数=总括号数-能正确配对的括号数。

  所以,我们不妨这样设计状态:用f[i][j]表示i到j区间内能配对成功的括号数。

  那么f[i][j]怎么转移呢?如果用s数组来表示字符串,那么如果s[i]==s[j],那么就有f[i][j]=f[i+1][j-1]+2。可能有点难理解,图解一下:

  

  那么这是s[i]==s[j]时的操作(难点),剩下的就是老套路了,f[i][j]=max(f[i][j],f[i][k]+f[k+1][j])。

  代码很简单,就不加注释了。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 string s;int n,f[1000][1000];
 5 int main()
 6 {
 7     cin>>s;
 8     n=s.length();
 9     for(int t=1;t<=n-1;t++)
10     for(int i=0;i<n-t;i++)
11     {
12         int j=i+t;
13         if((s[i]==‘(‘&&s[j]==‘)‘)||(s[i]==‘[‘&&s[j]==‘]‘)) f[i][j]=f[i+1][j-1]+2;
14         for(int k=i;k<j;k++)
15         f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);
16     }
17     cout<<n-f[0][n-1];
18     return 0;
19 }

原文地址:https://www.cnblogs.com/TFLS-gzr/p/11169538.html

时间: 2024-07-29 16:41:03

【算法?日更?第八期】区间动态规划:1572:括号配对题解的相关文章

【算法?日更?第十七期】信息奥赛一本通1598:【 例 2】最大连续和题解

废话不多说,直接上题: 1598:[ 例 2]最大连续和 时间限制: 1000 ms         内存限制: 524288 KB提交数: 303     通过数: 91 [题目描述] 给你一个长度为 n 的整数序列 {A1,A2,?,An},要求从中找出一段连续的长度不超过 m 的子序列,使得这个序列的和最大. [输入] 第一行为两个整数 n,m: 第二行为 n 个用空格分开的整数序列,每个数的绝对值都小于 1000. [输出] 仅一个整数,表示连续长度不超过 m 的最大子序列和. [输入样

【算法?日更?第二十期】构造分治

▎什么是分治? ?『定义』 分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.在计算机科学中,分治法就是运用分治思想的一种很重要的算法.分治法是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等等.(copy自百度) 一句话总结:分治就是把大问题转化成若干小问题,小问题解决后,大问题自然就迎刃而解. ?『使用条件』 ①大问题分解成

日更第6期-2015-1-29-如何科学地使用因特网-第一讲-总之先爬墙

哟哟,我又来日更了啊!O(∩_∩)O哈哈~不过,其实是隔了两天,不过比起上次,是要好了不少. 先说个好消息吧!我1月31日就要放假啦,然后就可以回家啦. 然后,回家之后,我就要正式的日更啦!现在为止我可是一直在隐藏实力哦.我要从几天一更进化为一天几更. 先试试一夜七次...... 恩,说点正经的:我接下来会更新些什么内容. 第一部分,OpenFrameworks的使用,即OpenFrameworks系列教程,里面包括example的解释,tutorial的 翻译,api的详解以及最新例子的展示.

日更第2期-2015-1-15-openFrameworks系列第一讲-手把手制作openFrameworks上的第一个程序!

恩,今天和朋友打球来着,于是今天的案例程序就做一个球吧!O(∩_∩)O哈哈~ 首先,没有看过上一篇教程的同学,还有还没有下载好VS和OpenFrameworks的同学,都去下一下. 传送地址:http://www.cnblogs.com/linongbo/p/4227552.html 那么,开始今天的日更啦! Hello OpenFrameworks! VS的安装部分我就不说了,不过我个人建议——默认是安装在C盘的,不过你要是手动改到别的盘上的话,C盘上 依然会有6G左右的内容.......Σ(

日更第11期-2015-3-27-processing教程-API篇-第一讲-map(),Table,loadTable(),norm(),lerp()

hI!!今天上线发现我多了一个粉丝!!哇,好高兴! 不过我昨天食言了,没有继续日更......希望不会掉粉..... 不过那是有原因的,我昨天一直在找数据,终于今天给整理好了,我打算这个周末整一整.然后就可以出真正厉害的教程啦!! 我先说一下我接下来会出的教程,然后说说今天发的这个到底是什么. 接下来: 1,美国失业数据可视化 2,地图数据可视化案例教学(案例来自processing教学书visualizing data) 3,中国高考分地域分析 4,API教程 然后说说今天这是干啥. 简单来说

日更第4期-2015-1-19-openFrameworks系列第三讲-面向对象的小球们

昨天的教程里,实在有太多想讲的东西了,所以反而什么都没有讲.一个很大的原因就是——我妄想让所有 水平的读者都能读懂.这其实是绝对不可能的.因为,每个人知识面不同,已经掌握的技能也不同,那么所 适应的学习轨迹其实也该不同. 以我个人来说,我其实是一个谨慎型的人,在学习的过程中一般不会冒进,这意味着我的基础知识会更加 扎实,但是进步的速度就会偏慢.我在这里写博客,其实就是一种学习方式,但无疑,这种学习方式其实很 效率低下(而且还没有人看).可是,对于我就是一个很好的补充......感觉有点跑题了,其

【算法?日更?第二十五期】万能算法(一):搜索+?

▎前言 看到这个标题,你是不是倍感疑惑,为什么会是搜索+,而不是搜索,会不会是小编打错的,其实本篇博客将会让你看到搜索的各种玩法. ▎前置技能 ?『基础知识』 搜索:dfs和bfs(戳这里迅速上手). ?『dfs和bfs的异同点』 相同点:dfs和bfs都用于搜索,都是来寻找点的. 不同点:dfs以深度为优先,不撞南墙不回头,一鼓作气搜遍一条路,所以比较不靠谱,但是代码量少,也好写,大部分人都喜欢用.而bfs则是以广度为优先,逐层遍历,相比dfs来说更加理性,但是当状态不好存储时,就只能用dfs

【算法?日更?第二十六期】非常基础的数论

一说到基础数论,那么我们就从整除那套理论开始谈起. ▎整除 ?『定义』 如果a能把b整除,也就是没有余数,则我们称a整除b,亦称b被a整除,记为a|b. 其中的“|”称为整除符号. ?『性质』 ①自反性:显然,对于任意正整数n,有n|n: ②传递性:若有a|b,b|c,则有a|c: ③反对称性:若a|b,b|a,则有a=b: 其中性质③很有用,通常用于无法直接证明a=b的情况,不过用到的少. ▎约数和倍数 ?『定义』 如果a|b,那么a是b的约数,b是a的倍数,也称a是b的因数/因子. ?『推论

【算法?日更?第五十期】二分图(km算法)

▎前言 戳开这个链接看看,惊不惊喜,意不意外?传送门. 没想到我的博客竟然被别人据为己有了,还没办法投诉. 这年头写个博客太难了~~~ 之前小编写过了二分图的一些基础知识和匈牙利算法,今天来讲一讲km算法,若你不知道匈牙利算法,请先看下面的博客.(否则会体验极差) 传送门 ▎km算法 ?『引入』 之前学习的匈牙利算法还记得吗?它处理的是无权二分图,长这个样子: //mspaint画出来的真粗糙 但是如果加入了权值呢?比如说是这个样子的: 现在,我们的问题变了,不再求最大匹配问题了,而是最优匹配问