当前位置: 首页 > news >正文

蓝桥杯每日一题2023.10.5

3420. 括号序列 - AcWing题库

题目描述

题目分析 

对于这一我们需要有前缀知识完全背包

完全背包的朴素写法:

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, v[N], w[N], f[N][N];
int main()
{cin >> n >> m;for(int i = 1; i <= n; i ++)cin >> v[i] >> w[i];for(int i = 1; i <= n; i ++){for(int j = 0; j <= m; j ++){for(int k = 0; k * v[i] <= j; k ++){f[i][j] = max(f[i][j], f[i - 1][j - v[i] * k] + w[i] * k);}}}cout << f[n][m] << '\n';return 0;
}

经行优化:

f[i][j] = f[i - 1][j - v[i] * k] + w[i] * k
f[i][j] = max(f[i - 1][j], f[i - 1][j - v] + w, f[i - 1][j - 2v] + 2w, f[i - 1][j - 3v] + 3w, ...)
f[i][j - v] = max(         f[i - 1][j - v],       f[i - 1][j - 2v] + w,    f[i - 1][j - 3v] + 2w, ...)
f[i][j] = max(f[i - 1][j], f[i][j - v] + w)

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, v[N], w[N], f[N][N];
int main()
{cin >> n >> m;for(int i = 1; i <= n; i ++)cin >> v[i] >> w[i];for(int i = 1; i <= n; i ++){for(int j = 0; j <= m; j ++){for(int k = 0; k * v[i] <= j; k ++){f[i][j] = f[i - 1][j];if(j >= v[i])f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);}}}cout << f[n][m] << '\n';return 0;
}

 首先由题意知我们左右括号的数量必须相等,对于任意前缀的左括号的数量必须大于等于有括号的数量(如果小于则此处必定需要添加括号)

我们可以分为两种方案使其独立存在,一种是只添加左括号,一种是只添加右括号,这两种方案各进行一次,将方案数相乘则为总方案数,对于左右进行的操作只需用同一代码即可,我们可以只写对左括号进行操作,对于右括号操作我们只需要将字符串翻转即可实现操作

使用动态规划来记录方案数

f[i][j] :只考虑前i部分,左括号比右括号多j 个的所有方案的集合(不同数量的左括号的方案数)

1.若s[i] == '(' f[i][j] = f[i - 1][j - 1](考虑前i - 1部分时,左括号数量比右括号数量多j - 1个,那么第i部分左括号就比右括号多j个)

2.若s[i] == ')' f[i][j] = f[i - 1][j + 1] + f[i - 1][j] + ... + f[i - 1][0](考虑前i - 1部分左括号数量最多比右括号数量多j + 1个,才能在第i部分通过添加或者不加左括号使左括号的数量比右括号的数量多j个)注:这里类似于完全背包的优化:f[i][j] = f[i - 1][j + 1] + f[i][j - 1],考虑越界问题,f[i][0]特判(j == 0,j - 1 = -1越界)f[i][0]可以考虑前i - 1部分左括号数和右括号数相等 和 左括号数比右括号数多一个的和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5010, mod = 1e9 + 7;
char s[N];
int n;
ll f[N][N];
ll work()
{memset(f, 0, sizeof f);f[0][0] = 1;for(int i = 1; i <= n; i ++){if(s[i] == '('){for(int j = 1; j <= n; j ++)f[i][j] = f[i - 1][j - 1];}else{f[i][0] = (f[i - 1][0] + f[i - 1][1]) % mod;for(int j = 1; j <= n; j ++)f[i][j] = (f[i - 1][j + 1] + f[i][j - 1]) % mod;}}for(int i = 0; i <= n; i ++){if(f[n][i])return f[n][i];}return -1;
}
int main()
{cin >> s + 1;n = strlen(s + 1);ll l = work();reverse(s + 1, s + n + 1);for(int i = 1; i <= n; i ++){if(s[i] == '(')s[i] = ')';else s[i] = '(';}ll r = work();cout << l * r % mod;return 0;
}
http://www.lryc.cn/news/182915.html

相关文章:

  • PyTorch实例:简单线性回归的训练和反向传播解析
  • Arcgis提取玉米种植地分布,并以此为掩膜提取遥感影像
  • 软件工程与计算总结(四)项目管理基础
  • 【Python】datetime 库
  • 从0开始python学习-28.selenium 需要图片验证的登录
  • Nginx搭建Rtmp流媒体服务,并使用Ffmpeg推流
  • IDEA 将一个普通Java工程转化为maven工程
  • linux下的永久保存行号
  • 92岁高龄的创始人张忠谋谈台积电发展史
  • 【VIM】VIm初步使用
  • 教育类《中学政史地》收稿方向-投稿邮箱
  • 数据库的备份与恢复
  • string类的模拟实现(万字讲解超详细)
  • C 函数指针
  • zkVM设计性能分析
  • 调用gethostbyname实现域名解析(附源码)
  • 面向无线传感器网络WSN的增强型MODLEACH设计与仿真(Matlab代码实现)
  • 前端页面初步开发
  • 【赠书活动第3期】《构建新型网络形态下的网络空间安全体系》——用“价值”的视角来看安全
  • 基于SpringBoot的智能推荐的卫生健康系统
  • 几种开源协议的区别(Apache、MIT、BSD、MPL、GPL、LGPL)
  • 通过usb串口发送接收数据
  • Python3数据科学包系列(三):数据分析实战
  • UE4.27.2 自定义 PrimitiveComponent 出现的问题
  • 【docker】数据卷和数据卷容器
  • HTML——列表,表格,表单内容的讲解
  • Mongodb学习
  • 2024届计算机毕业生福利来啦!Python毕业设计选题分享Django毕设选题大全Flask毕设选题最易过题目
  • 网络爬虫指南
  • 9、媒体元素标签