博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA-1626 Brackets sequence (简单区间DP)
阅读量:4542 次
发布时间:2019-06-08

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

题目大意:给一个有小括号和中括号组成的序列,满足题中的三个条件时,是合法的。不满足时是不合法的,问将一个不合法的序列最少添加几个括号可以使之变成合法的。输出最短合法序列。

题目分析:这是《入门经典》上的一道例题。如果仅让求最短序列是极简单的,定义dp(i,j)表示将区间 i~j 变为合法添加的最小字符数.

      则 dp(i,j)=dp(i+1,j-1)   (i与j能匹配时),    dp(i,j)=min(dp(i,k)+dp(k+1,j))。

但是,输出的时候就比较慢了。从左往右通过比较选择最优方案递归输出(看的书上代码)。

 

代码如下:

# include
# include
# include
# include
using namespace std;char p[105];int dp[105][105];const int INF=100000;bool match(int x,int y){ if(p[x]=='('&&p[y]==')') return true; if(p[x]=='['&&p[y]==']') return true; return false;}void DP(){ int len=strlen(p); for(int l=1;l<=len;++l){ for(int i=0;i+l-1
j) return ; if(i==j){ if(p[i]=='('||p[i]==')') printf("()"); else printf("[]"); return ; } int ans=dp[i][j]; if(match(i,j)&&ans==dp[i+1][j-1]){ printf("%c",p[i]); print(i+1,j-1); printf("%c",p[j]); return ; } for(int k=i;k
0){ DP(); print(0,len-1); } printf("\n"); if(T) printf("\n"); } return 0;}

  

转载于:https://www.cnblogs.com/20143605--pcx/p/4791122.html

你可能感兴趣的文章
C# MySql 操作类
查看>>
[NOI2013]矩阵游戏
查看>>
转:不规则按钮实现
查看>>
poj 3744 Scout YYF I (矩阵快速幂)
查看>>
bzoj 2075: [POI2004]KAG
查看>>
python 3 day1(下)
查看>>
调试CS5343总结报告
查看>>
hdu 2586 How far away ? Lca的模板了、、
查看>>
JavaScript筑基篇(二)->JavaScript数据类型
查看>>
Google常用拓展插件
查看>>
一个麻省理工学院毕业生对中国教育的反思
查看>>
Drupal7重置密码方法
查看>>
WEB安全问题
查看>>
C++重载运算符练习--对people类重载“= =”运算符和“=”运算符
查看>>
Nmap命令的实用范例
查看>>
7-1 查找整数编程总结
查看>>
安装PHP以及搭建博客(一)
查看>>
关于WORD文档的读取乱码问题
查看>>
[问题记录.dotnet]取网卡信息报错"找不到"-WMI - Not found
查看>>
Codeforces Round #254 (Div. 2):B. DZY Loves Chemistry
查看>>