博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Uva 1626 - Brakets Sequence(DP)
阅读量:4494 次
发布时间:2019-06-08

本文共 1234 字,大约阅读时间需要 4 分钟。

题目链接

【题意】

定义如下正规括号序列

  • 空序列是正规括号序列
  • 如果S是正规括号序列,那么[S], (S)也是正规括号序列
  • 如果A和B都是正规括号序列,那么AB也是正规括号序列

输入一个长度不超过100的只有’(‘, ‘)’, ‘[‘, ‘]’组成的字符串序列,添加最少的括号得到一个规则序列,如果有多解输出任意一组即可

【思路】

设将串S变为正规序列至少需要dp(S)个括号,那么

  • 如果S的结构是(S’)或[S’],那么就可以转移到dp(S’)
  • 如果S至少有两个字符,那么可以划分为两个部分AB,转移到dp(A)+dp(B)

编程实现的时候,dp(i,j)表示的是把s[i~j]变成正规括号序列所需要添加的最少括号个数,状态转移方程为

dp(i,j)=min{  dp(i+1,j-1), s[i]和s[j]匹配
                  dp(i,k)+dp(k+1,j),i<=k< j }

打印解的时候用递归函数打印,我感觉这个思路很巧妙,自己很难想到,基本上是把紫书的代码抄了一遍,然后下面的代码用C++11能过,用C++会编译错误,会在gets()这里报错,然而并不知道这是为什么

#include
#include
#include
#include
#include
using namespace std;const int inf=2e9;const int maxn=105;char s[maxn];int dp[maxn][maxn];bool match(char c1,char c2){ if(c1=='(' && c2==')') return true; if(c1=='[' && c2==']') return true; return false;}void print(int i,int j){
//打印s[i~j]的解 if(i>j) return; if(i==j){ if(s[i]=='(' || s[i]==')') printf("()"); else printf("[]"); return; } int ans=dp[i][j]; if(match(s[i],s[j]) && ans==dp[i+1][j-1]) { printf("%c",s[i]); print(i+1,j-1); printf("%c",s[j]); return; } for(int k=i;k

转载于:https://www.cnblogs.com/wafish/p/10465330.html

你可能感兴趣的文章
Leetcode 350. Intersection of Two Arrays II
查看>>
EditPlus VC2010 and 2008 C/C++配置
查看>>
Practical Lessons from Predicting Clicks on Ads at Facebook
查看>>
JFrame面板
查看>>
Android自动化压力测试之Monkey Test 异常解读(五)
查看>>
Compressing Convolutional Neural Networks in the Frequency Domain 论文笔记
查看>>
设计模式:单例和多例
查看>>
Myslq 之修改数据库
查看>>
maven工程转为web工程时没有add web project capabilities选项的解决办法
查看>>
[BZOJ1192][HNOI2006]鬼谷子的钱袋
查看>>
Linux系统基础优化
查看>>
小程序开发快速入门教程(附源码)
查看>>
基于cropper.js的图片上传和裁剪
查看>>
车联网SaaS平台多租户平台技术选型参考
查看>>
我是如何快速积累工作经验
查看>>
用信号量进程同步与互斥
查看>>
随笔1
查看>>
Codeforces Round #469 (Div. 2)
查看>>
JavaScript:Number 对象
查看>>
事务同步多线程
查看>>