首页 > 其他分享 >CF1598F RBS

CF1598F RBS

时间:2023-08-16 17:47:37浏览次数:33  
标签:CF1598F int lim sum texttt RBS 括号 序列

题目大意

定义括号序列为只包括 \(\texttt{(}\) 和 \(\texttt{)}\) 的字符串。一个匹配的括号序列(简记为 RBS)满足,可以在其中加入 \(1\) 和 \(+\),将其转化为合法的代数式,例如:

  • \(\texttt{()()}\) 和 \(\texttt{(())}\) 是匹配的;
  • \(\texttt{)(}\) 和 \(\texttt{(}\) 和 \(\texttt{)}\) 不是。

将两个字符串拼接在一起简记为 \(x+y\)。例如,\(\texttt{()()}+\texttt{)(}=\texttt{()())(}\)。

给定 \(n\) 个括号序列 \(s_1\sim s_n\),你可以将他们任意重新排序,要求使得最终排序后的字符串满足 \(s_1+\dots+s_n\) 的 RBS 前缀个数最多。

思路

首先考虑把括号序列改写成由 \(1\) 和 \(-1\) 构成的序列,把 \(\texttt{(}\) 看作 \(1\),\(\texttt{)}\) 看作 \(-1\)。

如果一个括号序列是匹配的,那么它的任意前缀的权值和均为非负,且整个序列的权值为 \(0\)。

如果一个 \(a\) 串能够在后面接一个 \(b\) 串使得形成了更长的括号序列,那么这个 \(a\) 串的权值一定是非负的。\(a\) 串最后可以有多出来的 \(\texttt{(}\),也可以没有多出的部分,但不能有多出的 \(\texttt{)}\)。

我们设这个 \(a\) 串的权值为 \(x\),设 \(b_i\) 的最小前缀和为 \(y\)。

  1. 假设 \(x+y<0\),那么说明在 \(a\) 和 \(b\) 拼接成的新串中存在前缀和小于 \(0\) 的前缀,即右括号数量多于左括号,不能再继续往后边加串了。我们造成的贡献是从 \(b\) 串开头到第一个小于 \(0\) 位置之前的部分中,前缀和为 \(-x\) 的位置的个数。也就是说,这里只更新答案,不继续进行转移。

  2. 若 \(x+y\geq0\),说明还能继续向后匹配,我们在更新答案的同时还需要继续向后转移。

考虑状压,开个桶存一下每种前缀和值的数量和第一次出现 \(-x-1\) 之前出现 \(-x\) 的数量,map 会被卡,可以用 unordered_map,内部是用哈希实现(不过可能有人丧心病狂对着模数卡)。

Code

#include <bits/stdc++.h>

using namespace std;

#define lim(x) (1 << x - 1)

const int N = 33;

int n;
int ans = INT_MIN >> 2,sum;

string st[33];

int MinPre[lim(21) + 114],val[N];
int Val[lim(21) + 114];
int dp[lim(21) + 114];

unordered_map<int,int> bucket[N];
unordered_map<int,int> UpdateBucket[N];

bool legal[lim(21) + 114];

int main() {
    cin >> n;
    for(int i = 1;i <= n; i++) {
        cin >> st[i];
        sum = 0;

        for(int j = 0;j < st[i].size(); j++) {
            if(st[i][j] == '(')
                sum += 1;
            else
                sum -= 1;

            MinPre[i] = min(MinPre[i],sum);
            bucket[i][sum] ++;

            if(bucket[i][sum] == 1) 
                UpdateBucket[i][sum] = bucket[i][sum + 1];
        }

        val[i] = sum;
    }

    legal[0] = 1;

    for(int s = 0;s < lim(n + 1); s++) {
        sum = 0;
        
        for(int i = 1;i <= n; i++) 
            if(s & lim(i)) 
                sum += val[i];

        Val[s] = sum;
        // 状态的权值 
    }

    
    for(int s = 0;s < lim(n + 1); s++) {
        if(!legal[s])// 不合法 
            Val[s] = -1;
        
        if(Val[s] < 0) {
            dp[s] = 0;
            continue;
        }

        sum = Val[s];

        for(int i = 1;i <= n; i++) {
            if(s & lim(i))
                continue;
            
            if(sum + MinPre[i] < 0) // 只更新不转移
                ans = max(ans,dp[s] + UpdateBucket[i][-sum - 1]);
            else {// 更新且转移 
                legal[s | lim(i)] = 1;
                dp[s | lim(i)] = max(dp[s | lim(i)],dp[s] + bucket[i][-sum]); 
            }
        }
    }

    for(int s = 0;s < lim(n + 1); s++)
        ans = max(ans,dp[s]);
    
    cout << ans;
    return 0;
}

标签:CF1598F,int,lim,sum,texttt,RBS,括号,序列
From: https://www.cnblogs.com/baijian0212/p/CF1598F.html

相关文章

  • ubuntu20安装orbslam3 ros版本
    使用ubuntu20自带的opencv4.2似乎没有任何问题sudoaptinstalllibcanberra-gtk-modulelibcanberra-gtk3-module-ysudoapt-getinstallpython3-pipsudopip3installrosdepcsudorosdepcinitrosdepcupdatesed-i's/++11/++14/g'CMakeLists.txt增加:${PROJECT_SOURCE_DI......
  • mac M2 多个 docker环境 colim 、docker for mac 、orbstack
    三个环境存在是会让docker命令混乱colim真实的路径/opt/homebrew/bin/docker->/opt/homebrew/Cellar/docker/24.0.2/bin/dockerdocker.sock~/.colim/run/docker.sockdockerformac真实的路径/usr/local/bin/docker->/Applications/Docker.app/Contents/Res......
  • 易基因: RRBS揭示基于DNA甲基化驱动基因的肾透明细胞癌预后模型的鉴定和验证|项目文章
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。肾细胞癌(RCC)是最常见的肾癌亚型,每年超400万例新发病例,是泌尿系统恶性肿瘤导致的第二大死因。2%-70%的RCC为透明细胞RCC(Clearcellrenalcellcarcinoma,ccRCC)。DNA甲基化(DNAmethylation,DNAm)是主要的表观遗传修饰之一......
  • 使用ORBSLAM2进行kineticV2稠密建图,实时转octomap建图以及导航
    决定总结最近一个月的工作,这个月在orbslam2的基础上,使用kineticV2完成了稠密点云地图的重建,实现了点云的回环,并使用octomap转换成实时的八叉树地图,导航部分已经有了思路,打算下个月所一个基于octomap的航迹生成能用在视觉的导航上。一、传感器和依赖包安装PC性能:Dellxps13内存16GB......
  • 使用教程 | 基于TSMaster如何实现LIN RBS 剩余总线仿真
    本文导读RBS全称是:residualbussimulation,也就是所谓的剩余总线仿真。主要是基于车载网络数据库,如CAN/LIN/FlexRay/以太网数据库,仿真该网络内部各个节点的通讯行为。本文主要讲解TSMaster中LINRBS的操作流程。本文目录:一、硬件连接准备二、TSMaster软件LINRBS操作流程1.......
  • 易基因: oxRRBS+RRBS揭示炎症性肠病导致发育异常的表观遗传机制|甲基化研究
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。2020年12月31日,美国明尼苏达大学NataliaY.Tretyakova教授团队在《IntJMolSci》杂志发表题为“Multi-OmicsCharacterizationofInflammatoryBowelDisease-InducedHyperplasia/DysplasiaintheRag2-/-/Il10......
  • 关于 Spartacus 新的交付方式 RBSC 和用到的一些工具
    JFrog是一家软件公司,提供了一系列的工具和技术,帮助开发者和组织更高效地管理软件开发、交付和部署的整个生命周期。JFrog的产品主要包括Artifactory、Xray、Pipelines、Dist......
  • ORBSLAM2编译出现的问题
    ORBSLAM也编译了好多次了,因为后来出现别的算法使用的opencv的版本不同,总会出现问题。因此记录一下。首先一定要注意OpenCV的版本,我这里使用的是3.4.16的版本,然后要和Cmake......
  • 易基因|RRBS单碱基绘制580种动物的基因组规模DNA甲基化谱:Nature子刊
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。2023年01月16日,奥地利科学院分子医学研究中心(CeMM)研究团队在《NatCommun》杂志发表了题为“Comparative......
  • orbslam3(1)安装和编译
      https://github.com/UZ-SLAMLab/ORB_SLAM30环境ubuntu20opencv3.4.9ros roscvbriage单独根据opencv重新编译(vins-fusion安装编译的) 1安装下载gitcl......