题意  给定一个长度为偶数的字符串。这个字符串由三种括号组成。

   现在要把这个字符串修改为一个符合括号完全匹配的字符串,改变一个括号的代价为$1$,求最小总代价。

区间DP。令$dp[i][j]$为把子序列$[i,j]$修改为符合要求的括号序列。

其中$cnt$为调整当前最外层的那对括号所需的最小代价。

那么有状态转移方程$dp[i][j] = min(dp[i+1][j-1] + cnt, min(dp[i][k] + dp[k+1][j]))$

用记忆化搜索实现。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 53; int f[N][N];
int a[N];
int n; int dp(int l, int r){
if (l > r) return 0;
if (~f[l][r]) return f[l][r]; int cnt = 0;
if (a[l] > 0 && a[r] < 0 && a[l] + a[r] == 0) cnt = 0;
else if (a[l] > 0 || a[r] < 0) cnt = 1;
else cnt = 2; int ret = dp(l + 1, r - 1) + cnt; for (int i = l + 1; i <= r - 1; i += 2) ret = min(ret, dp(l, i) + dp(i + 1, r));
return f[l][r] = ret;
} class CorrectingParenthesization {
public:
int getMinErrors(string s){
memset(f, -1, sizeof f);
n = s.size();
rep(i, 0, n - 1){
if (s[i] == '(') a[i + 1] = 1;
else if (s[i] == '[') a[i + 1] = 2;
else if (s[i] == '{') a[i + 1] = 3;
else if (s[i] == ')') a[i + 1] = -1;
else if (s[i] == ']') a[i + 1] = -2;
else if (s[i] == '}') a[i + 1] = -3;
} return dp(1, n);
}
};

最新文章

  1. ElasticSearch 5学习(10)——结构化查询(包括新特性)
  2. Android 5.0源码编译问题
  3. 各大IT技术博客排行榜
  4. 编译原理词法分析 java简单实现
  5. ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
  6. WP8.1&amp;Win10开发:TextBox获取和失去焦点小技巧
  7. SQLi filter evasion cheat sheet (MySQL)
  8. ConcurrentHashMap使用要点
  9. NAS4Free 安装配置 -- 目录
  10. laravel database的事务函数
  11. Luogu 1111 修复公路(最小生成树)
  12. HBase Compaction
  13. CSS3概述
  14. 小甲鱼零基础python课后题 P22 021函数:递归是神马
  15. 嵌入式linux——汇编、C语言基础(一)
  16. JQuery实现全选、全不选和反选功能
  17. 「NOI2018」屠龙勇士(EXCRT)
  18. 进程间通信IPC机制和生产者消费者模型
  19. e与复利
  20. 在 Core Data 中存取 transformable 类型的数据

热门文章

  1. 2、python中的数字
  2. requests中文页面乱码解决方案【转】
  3. Python框架之Django学习笔记(十五)
  4. 堆STL和重载运算符
  5. dib build ipa image Injection password
  6. 实用拜占庭容错算法PBFT
  7. C++字符串高效查找替换,有空分析分析
  8. Mysql 死锁
  9. 【Luogu】P2485计算器(快速幂,exgcd和Bsgs模板)
  10. ZOJ 3362 Beer Problem(SPFA费用流应用)