daimayuan 括号序列(dp)

简介: daimayuan 括号序列(dp)


使用记忆化搜索

/*********************************************************************
    程序名:
    版权: Joecai
    作者: Joecai
    日期: 2022-04-05 19:47
    说明:
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
# define rep(i,be,en) for(int i=be;i<=en;i++)
# define pre(i,be,en) for(int i=be;i>=en;i--)
typedef pair<int, int> PII;
#define ll long long
#define endl "\n"
#define LOCAL
#define pb push_back
#define eb emplace_back
#define sp(i) setprecision(i)
const int N = 1e3 + 10, INF = 0x3f3f3f3f;
int f[N][N];
int n;
char s[N];
int dfs(int l, int r)
{
  int res = 0;
  if (l >= r)
  {
    return f[l][r] = 0;
  }
  if (f[l][r] != -1)
  {
    return f[l][r];
  }
  if (r == l + 1)
  {
    if (s[l] == '[' && s[r] == ']') f[l][r] = 2;
    else if (s[l] == '(' && s[r] == ')') f[l][r] = 2;
    else return f[l][r] = 0;
  }
  for (int i = l; i < r; i++)
  {
    res = max(res, dfs(l, i) + dfs(i + 1, r));
  }
  if (s[l] == '[' && s[r] == ']' || s[l] == '(' && s[r] == ')')
    res = max(res, dfs(l + 1, r - 1) + 2);
  return f[l][r] = res;
}
void solve()
{
  int n;
  cin >> n;
  memset(f, -1, sizeof(f));
  cin >> s + 1;
  cout << dfs(1, n) << endl;
}
int main() {
//  std::ios::sync_with_stdio(false);
//  std::cin.tie(nullptr);
  //#ifdef LOCAL
  //freopen("data.in.txt","r",stdin);
  //freopen("data.out.txt","w",stdout);
  //#endif
  int __ = 1;
  //cin >> __;
  while (__--)
  {
    solve();
  }
  return 0;
}


目录
相关文章
|
9天前
树形dp常见类型——换根dp
树形dp常见类型——换根dp
|
15天前
[leetcode ~dp ]279. 完全平方数
[leetcode ~dp ]279. 完全平方数
动态规划(DP)——区间DP
动态规划(DP)——区间DP
|
9月前
|
算法 Java 测试技术
dp算法 力扣152乘积最大子数组
dp算法 力扣152乘积最大子数组
|
11月前
|
存储 算法
dp 就 dp ,数位dp是什么意思 ?
dp 就 dp ,数位dp是什么意思 ?
227 0
|
人工智能
(闫氏dp分析法)(线性dp)(区间类dp)AcWing 895. 最长上升子序列
(闫氏dp分析法)(线性dp)(区间类dp)AcWing 895. 最长上升子序列
66 0
|
存储 算法
dp 问题 --- 斐波那契数列 \ 数组最大子序列和
dp 问题 --- 斐波那契数列 \ 数组最大子序列和
57 0
|
人工智能
洛谷P1115-最大子段和(DP-最大子段和)
洛谷P1115-最大子段和(DP-最大子段和)
洛谷P1115-最大子段和(DP-最大子段和)
|
人工智能 C++
牛妹爱数列(动态规划 dp)
牛妹正在玩一个数列,他手里有一个长度为n的序列a,保证它是一个01序列,并执行以下两种操作:1.单点修改:将位置x上的数翻转(0变1,1变0);2.前缀修改:将位置1~x上的数翻转(每个数都0变1,1变0)。他现在想要最小化翻转次数,使得数列上的所有数都变为0。
牛妹爱数列(动态规划 dp)