这道题目能用区间dp来解决,是因为一个大区间的括号匹配数是可以由小区间最优化选取得到(也就是满足最优子结构)

然后构造dp

既然是区间类型的dp 一般用二维 我们定义dp[i][j] 表示i~j这个区间需要添加括号的数量

那么状态怎么转移呢?

第一种情况:对于i指向的括号 如果i+1 ~ j里面不存在与之匹配的括号 那么dp[i][j] =dp[i+1][j]+1;

第二种情况:对于i指向的括号 如果i+1~ j 里面存在与之匹配的括号下标我们记作k 那么在i+1 ~ j 中我们枚举所有的k

dp[i][j]=min(dp[i+1][k-1]+dp[k+1][j],dp[i][j]);

定义好状态转移方程以后 后续的就是合理的对数据填充了 应为dp[i]要用到dp[i+1]的结果 所以我们这里自底向上的遍历

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
char s[101];
bool check(int i,int j)
{
if(s[i]=='('&&s[j]==')' || s[i]=='['&&s[j]==']') return true;
return false;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int dp[101][101];
cin>>s;
int len=strlen(s);
memset(dp,0,sizeof(dp));
for(int i=0;i<len;i++) dp[i][i]=1;
for(int i=len-2; i>=0; i--)
{
for(int j=i; j<len; j++)
{
dp[i][j]=dp[i+1][j]+1;// 第一种情况我们先赋值,由于后续是最小值的比较 所以问题不大
for(int k=i+1; k<=j; k++)
{
if(check(i,k))// 如果匹配
{
dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k+1][j]);
}
}
}
}
cout<<dp[0][len-1]<<endl;//
}
return 0;
}

  

最新文章

  1. GCC学习(1)之MinGW使用
  2. 《BI那点儿事》运用标准计分和离差——分析三国超一流统帅综合实力排名 绝对客观,数据说话
  3. paip.提升性能3倍--使用栈跟VirtualAlloc代替堆的使用.
  4. c 函数调用产生的汇编指令和数据在内存情况(1)
  5. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.4. 安装JDK
  6. Python-aiohttp百万并发
  7. tomcat中如何运行war包呢
  8. Java [leetcode 23]Merge k Sorted Lists
  9. 【Xamarin挖墙脚系列:常用的Mac 命令】
  10. hiveF 函数解析时间问题
  11. 【递归】hex2dec
  12. db2数据库备份与恢复
  13. kubernetes 开发 code-generator
  14. js回调函数以及同步与异步
  15. Shell 函数相关
  16. 上了IPD和CMMI,为什么还要搞敏捷?
  17. for循环的实例
  18. SpringMVC详细示例实战教程(较全开发教程)
  19. vue实现百度搜索下拉提示功能
  20. Spring MVC 处理JSON 使用HttpMessageConveter

热门文章

  1. 我的zshrc文件设置备份
  2. cassandra3.11.4集群搭建
  3. RDP连接失败的解决方法
  4. Mysql 逗号分隔行列转换总结
  5. 机器学习之保存与加载.pickle模型文件
  6. Springboot将mybatis替换为mybatis-plus
  7. Ubuntu16.04中VirtualBox中安装FreeBSD
  8. R语言与概率统计(三) 多元统计分析(上)
  9. MapUtils演示
  10. Docker save and load镜像保存