【NK月赛 JUNE2012 E】做错的作业

Time Limit:10000MS  Memory Limit:65536K
Total Submit:94 Accepted:54 
Case Time Limit:1000MS

Description

小影(人名) 的数学作业错误百出. 
老师:“你作业的表达式里面只有n个括号,怎么就写错了这么多?” 
“n那么大,都到300了。” 
老师:“那第一个小题只有一个括号你都写错了,这怎么解释?你看,你就写了一个‘(’,明显漏掉了一个‘)’吧?” 
“这……”小影似乎很清楚的记得自己是写的“()”,可是现在怎么只剩下“(”了呢? 
老师:“你看别人某某,写的多好?十道题都做对了。这样吧,我不看你的计算结果了,只看你的括号匹配得正不正确,你今天之内把你的括号修改正确就可以了……” 
“嘿嘿……我把括号全部划掉不就全对了?”小影阴险地想。 
老师:“……不过有一个条件:你只能添加括号而不能把括号划掉,并且你只能添加最少数量的括号。” 
“天呐!”小影瘫倒了,要知道十个题目里面只有第一题很简单,其他的题目括号数目是巨多的。 
看来,只能请善良的你帮帮小影了。

Input

只有一行,为一个长度为n的字符串,代表小影作业中写的括号。其中有4类括号“()”“[]”“<>”“{}”,“(”和“)”匹配,“[”和“]”匹配,“<”和“>”匹配,“{”和“}”匹配,左括号必须在左,右括号必须在右,其他组合是不匹配的。两个匹配的括号中间可以夹有其他已经匹配的括号。如“([<{}>])(){}”就是匹配的。

Output

一个整数,为小影最少需要添加的括号数目。

Sample Input

([(]{})(<>))

Sample Output

2

Hint

对于30%的数据,n<=50; 
对于100%的数据,n<=300

Source

命题:Chyy(08级24班);审题:Cauchy(08级5班);数据:Chyy。

我们用f[i][j]表示从第i个点开始的j个位置匹配所需的最小括号数

尝试求如下括号序列的最优解
1  2  3  4  5  6  7
(   [  (   ]  {  }   )
讨论j=1
f[1][1]=1   f[2][1]=1   f[3][1]=1   f[4][1]=1   f[5][1]=1   f[6][1]=1   f[7][1]=1
讨论j=2   
f[1][2]=2   f[2][2]=2   f[3][2]=2   f[4][2]=2   f[5][2]=0   f[6][2]=2
//新增的括号如果在前面j-1个括号中未找到匹配的,则在+1, 比如f[6][2]=f[6][1]上+1)
讨论j=3
f[1][3]=f[1][2]+1=3   //第3个括号在前两个括号中找不到匹配的
f[2][3]=f[3][1]=1       //(2和4匹配,在他们之间只有f[3][1])
f[3][3]=3  
f[4][3]=f[4][1]=1       //5和6已匹配
f[5][3]=f[5][2]+1       //第7个括号在前两个括号中没找到匹配的                
讨论j=4
f[1][4]=f[1][1]+f[3][1]=2   //(2和4已匹配)
f[2][4]=f[2][3]+1=2           //第5个括号在前三个括号中没有找到匹配的      
f[3][4]=f[3][2]=2;               //(5和6已匹配)
f[4][4]=f[4][3]+1=2;          //第7个括号在前三个括号中没有找到匹配的
讨论j=5 
f[1][5]=f[1][4]+1; 
f[2][5]=f[2][3]=1; 
f[3][5]=f[4][3]=1
讨论j=6
f[1][6]=f[1][4]=2  
f[2][6]=f[2][1]+f[4][3]=2
讨论j=7
f[1][7]=f[2][1]+f[4][3] 或f[2][5]   ,选f[2][5]=1

因此我们可以推出状态转移方程f[i][j]=min{f[i][j-1]+1, min{f[i][k-1]+f[k+i][j-k-1]}  }

其中min{f[i][k-1]+f[k+i][j-k-1]} 是表示i后第j个括号和i后第k个括号匹配,1=<k<=j-1

为了方便讨论,我们在输入的时候应该将输入的括号换成数字,从而容易判断括号是否匹配

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int inf=2e9;
char c[305];
int n,f[305][305],s[305];
int main(){scanf("%s",c+1);int i,j,k;n=strlen(c+1);for(i=1;i<=n;i++){if(c[i]=='(')s[i]=1;if(c[i]==')')s[i]=9;if(c[i]=='{')s[i]=2;if(c[i]=='}')s[i]=8;if(c[i]=='<')s[i]=3;if(c[i]=='>')s[i]=7;if(c[i]=='[')s[i]=4;if(c[i]==']')s[i]=6;}for(i=1;i<=n;i++)for(j=1;j<=n;j++)f[i][j]=inf;for(i=1;i<=n;i++)f[i][1]=1;for(j=1;j<=n;j++)for(i=1;i<=n-j+1;i++){f[i][j]=min(f[i][j],f[i][j-1]+1);for(k=1;k<=j-1;k++)if(s[i+k-1]+s[i+j-1]==10&&s[i+k-1]<s[i+j-1])f[i][j]=min(f[i][j],f[i][k-1]+f[k+i][j-k-1]);}cout<<f[1][n];
}

NKOI 1507 做错的括号相关推荐

  1. 浙江大学远程教育学院计算机考试,浙江大学远程教育学院机试题 Windows操作题(共15分,若有做错请酌情 ....docx...

    浙江大学远程教育学院机试题 Windows操作题(共15分,若有做错请酌情 ....docx 第 PAGE 26 页 共 NUMPAGES 36 页 浙江大学远程教育学院机试题 Windows操作题( ...

  2. 阿里技术大神:你没做错啥,你错在啥都没做

    难受,那是因为你正在爬坡,正在成长 你有没有想过,如果你现在做的工作,能看到你10年后的样子,你愿意吗? 领着固定薪水,做着熟练到形成肌肉记忆的事情. 有一天,在舒适区里呆得太久,想跳出来,发现已经没 ...

  3. 说你又不听,听你又不懂,懂你又不做,做你又做错,错你又不认,认你又不改,改又不服,不服也不说

    今天看到的最有意思的话 说你又不听,听你又不懂,懂你又不做,做你又做错,错你又不认,认你又不改,改又不服,不服也不说

  4. 90%的人都做错的用户画像,到底应该怎么做?

    前几天,有个搞运营的小伙伴向我吐槽,熬了几个夜做出来的用户画像被老板说垃圾.不管是市场人员.运营人员还是产品经理,都躲不开"用户画像",但经常听到伙伴们抱怨,这个词太大了,根本不知 ...

  5. 如何避免背光源正负极做错?

    背光源正负极做错,分为批量时偶尔有几片做错的和整批做错的,前面一种情况的话,应该是工人插灯时不小心给插反了,只要让工人插灯时认真一点,批量的货全检的话,是可以检测出来的. 还有一种是整批做错的,这个情 ...

  6. 177本名著浓缩成了177句话!别等自己做错时才明白

    .真正有气质的淑女,从不炫耀她所拥有的一切,她不告诉人她读过什么书,去过什么地方,有多少件衣服,买过什么珠宝,因为她没有自卑感.<圆舞> 2.如此情深,却难以启齿.原来你若真爱一个人,内心 ...

  7. 177本名著浓缩成了177句话!别等自己做错时才明

    1.真正有气质的淑女,从不炫耀她所拥有的一切,她不告诉人她读过什么书,去过什么地方,有多少件衣服,买过什么珠宝,因为她没有自卑感.<圆舞> 2.如此情深,却难以启齿.原来你若真爱一个人,内 ...

  8. 北大教授警告中老年人:千万不要死于无知!看看你做错多少

    北大教授警告中老年人:千万不要死于无知!看看你做错多少 演讲者:齐伯力(北京大学医学院附属医院内科主任) 去年我才从美国回来,此前在斯坦福呆了六年.今天我要给大家介绍很多新东西.北京市普查工作结束,北 ...

  9. 两边填上相同的数_一年级数学易错——“在括号里填上相同的数”

    撰文:茂喵喵 审核:仲修 嗨!大家好!欢迎来到茂喵喵每周图文分享系列!喵喵君特别开心每周给小朋友拓展知识.每周都能在喵喵图文分享学到很多知识的小朋友们是不是也非常开心呢.好的,我们开始在知识的海洋里遨 ...

最新文章

  1. python银行家算法代码_避免死锁的银行家算法C++程序实现
  2. 程序员如何避免陷入内卷?
  3. redis(二)redis实战 使用redis进行文章的排序
  4. easyUI 相关清空功能
  5. 应用程序“DEFAULT WEB SITE/ICLOCK”中的服务器错误
  6. 干货 | 算法工程师入门第一期——罗恒讲深度学习
  7. 【SPOJ 694】Distinct Substrings (更直接的求法)
  8. 【最短路】【Dijkstra】【图论】最小花费(jzoj 2125)
  9. windows下mysql8.x配置远程连接
  10. java redis jar_Java使用Redis
  11. 2013.11.20 流水
  12. windows和linux之间共享文件 samba的使用
  13. 利用C++语法进行特殊类设计
  14. [题解]luogu_P3593_[NOIP2017]逛公园(最短路相关计数
  15. mysql2000下载_sql2000企业版下载-my sql 2000企业版官方版 - 极光下载站
  16. 串口485接法图_RS-485 2线和4线的接法
  17. PS抠图工具Topaz ReMask中文汉化(win/mac版,含教程)
  18. SMCJ6.0CA TVS二极管应用领域(瞬态抑制二极管)
  19. 平衡二叉树(C++实现)
  20. 计划排产软件助力厨房电器业提升管理

热门文章

  1. 微信获取好友、公众号、群聊的信息
  2. 巴什博弈详解 HDU-1846
  3. 计算机毕业设计Java物料追溯系统(源码+系统+mysql数据库+Lw文档)
  4. Android开发画出中国地图,Android 绘制中国地图
  5. overflow超出部分省略号
  6. linux恢复到某一时间点,使用回滚磁盘功能如何实现将一块云盘的数据恢复到之前的某一时刻...
  7. “互联网+”背景下使用微信公众号增强班主任工作与整合教学资源(泰微课)...
  8. 提示用户此计算机没有授权,怎么解决电脑“未授权用户在此计算机上的
  9. 无线射频专题《无线局域网排错,第二层重传问题4@同频干扰与邻频干扰》
  10. z世代消费力白皮书_中国Z世代与美国千禧一代消费报告,你或许不应该错过!