题目传送门(洛谷)   题目传送门(UVA)


解题思路

很显然是一个区间dp,当然记忆化搜索完全可以AC,这里说一下区间dp。

区间dp的重要特征就是需要枚举中间节点k

看一看这道题,用f[i][j]表示从i...j组成合法序列需要添加括号的个数,

很显然,当s[i]==s[j]时,f[i][j]=f[i+1][j-1],然后枚举中间点k,就能写出动态转移方程:f[i][j]=max(f[i][j],f[i][k]+f[k+1][j])

为了保证在求f[i][j]时f[i+1][j-1]、f[i][k]、f[k+1][j]已经求完,第一层的i必须要倒着枚举,第二层j一定要正着枚举(手推一下就明白了QAQ)

求出f数组后,就要考虑怎样输出,因为输出的形式是(S)或[S],所以很显然用递归输出,加几个if特判就OK了。

然而,这道题我写完代码后一直是wa,三十分钟后才发现问题。

在读入t时,我一开始用的是cin>>t;看了题解后,终于发现应该是cin>>t后面再加上getchar();为什么呢?

终于发现困扰了我接近一个小时的问题根源了——

辣鸡洛谷出错题了!!样例中的t和第一组数据间有一行空格。。。(体现出看原题的重要性)

AC代码

 #include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<ctime>
#include<stack>
using namespace std;
string s;
int t,len,f[][];
void print(int l,int r){
if(l>r) return;
if(l==r){
if(s[l]=='('||s[l]==')') printf("()");
if(s[l]=='['||s[l]==']') printf("[]");
return;
}
if((f[l][r]==f[l+][r-])&&((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))){
printf("%c",s[l]);
print(l+,r-);
printf("%c",s[r]);
return;
}
for(int k=l;k<r;k++){
if(f[l][r]==f[l][k]+f[k+][r]){
print(l,k);
print(k+,r);
return;//找到一个正解就输出并return
}
}
}
int main()
{
scanf("%d",&t);
getchar();
while(t--){
memset(f,0x3f,sizeof(f));
getline(cin,s);
getline(cin,s);
len=s.length();
if(len==){
printf("\n\n");
continue;
}
f[][]=;
for(int i=;i<len;i++) f[i][i]=,f[i][i-]=;
for(int i=len-;i>=;i--){
for(int j=i+;j<len;j++){
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) f[i][j]=min(f[i][j],f[i+][j-]);
for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+][j]);
}
}
print(,len-);
printf("\n");
if(t) printf("\n");
}
return ;
}

最新文章

  1. JuCheap V2.0响应式后台管理系统模板正式发布beta版本
  2. .Net环境下的缓存技术介绍 (转)
  3. winform窗体置顶
  4. 时间戳 JavaScript parse() 方法 处理技巧
  5. SQL Server Profiler使用教程,通俗易懂才是王道
  6. JSP网站开发基础总结《二》
  7. [C#基础]Func和Action学习
  8. Distributed RPC —— 分布式RPC
  9. 精品手游《里奥的财富》高清版逆向移植家用机与PC平台(转)
  10. poj 1005 I Think I Need a Houseboat
  11. 10 个你需要了解的最佳 javascript 开发实践
  12. java中计时器的用法Timer和TimerTask的用法__java中利用Timer与TImerTask 计时器间隔执行任务
  13. 面试时,问哪些问题能试出一个Android应用开发者真正的水平?
  14. Collections你用对了吗?
  15. Ubuntu 16.04 升级 PHP 版本至 7.1
  16. 文本离散表示(二):新闻语料的one-hot编码
  17. 【Spring】bean动态注册到spring
  18. Kafka-Record(消息格式)
  19. android --------- 嵌套unity出现 your hardware does not support this application,sorry!
  20. [Ting&#39;s笔记Day8]活用套件carrierwave gem:(3)Deploy图片上传功能到Heroku网站

热门文章

  1. Maya2017下载安装与激活
  2. C# List&lt;object&gt; 按特定字段排序
  3. js关于小数点失精算法修正0.07*100竟然=7.000000000000001
  4. loj6038「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT
  5. Ubuntu 14.04 虚拟机配置固定ip地址
  6. zabbix创建钉钉报警
  7. CSS中浮动属性float及清除浮动
  8. Nginx负载均衡与反向代理—《亿级流量网站架构核心技术》
  9. js 通过浏览器直接打开应用程序(IOS,Android)
  10. LintCode之两两交换链表中的节点