CF351C Jeff and Brackets

广义矩阵加速 DP

题意

构造一个长度为 \(n×m\) 的合法括号序列。

第 \(i\) 个位置上的左括号代价为 \(a_{i~\text{mod}~n}\),右括号代价为 \(b_{i~\text{mod}~n}\)。



求最小代价。(\(1\leq n\leq 20,1\leq m\leq 10^7\))

题解

我们设 \(f_{i,j}\) 为到第 \(i\) 的位置、有 \(j\) 个左括号未被匹配的最小代价。

显然有:

\[f_{i,j}=
\left\{
\begin{aligned}
&\min ( f_{i-1,j-1}+a_{i~\text{mod}~n},f_{i-1,j+1}+b_{i~\text{mod}~n} )&j>0\\
&f_{i-1,1}+b_{i~\text{mod}~n}&j=0
\end{aligned}
\right.
\]

其中 \(f_{0,0}=0,f_{0,j}=+\infin(j\neq 0)\)。

这里有一个很关键的性质,就是 \(j\leq n\)。

证明(口胡版):若有一段 \(n+1\) 个连续的左括号,已经覆盖了模 \(n\) 意义下的所有下标,那么一定存在一个右括号能与对应模 \(n\) 下的下标相同的左括号交换,满足交换后序列仍然合法,且代价不变。

因此时间复杂度是 \(O(n^2m)\) 的。


考虑优化。

发现转移是存在周期的,周期为 \(n\),即模 \(n\) 意义下相同的 \(i\) 对应的转移方程形式上是一样的,所以各个周期内的转移方程是一样的,可以用矩阵加速。

形式上,在第一个周期内,将 \(f_{i,0},f_{i,1},\dots,f_{i,n}\) 打包成一个向量 \(A\),将转移抽象成一个矩阵,那么你就可以求出 \(0 \rightarrow n\) 的转移矩阵 \(T\),又因为总长度恰好是 \(n\times m\),所以答案就在 \(T^m\) 中。

具体的,对于第一周期 \(0\rightarrow n\),我们设

\[A_i=
\begin{bmatrix}
f_{i,0}\\f_{i,1}\\\vdots\\f_{i,n}
\end{bmatrix},
M_i=
\begin{bmatrix}
+\infty&b_i & +\infty & \cdots & +\infty \\
a_i &+ \infty & b_i & +\infty & \vdots \\
+\infty & a_i & +\infty & b_i\\
\vdots & +\infty & a_i &\ddots\\
+\infty & \cdots
\end{bmatrix}
\]

定义 \((\min,+)\) 为 广义矩阵乘法 \(A_{i,j}*B_{i,j}\),其中 \(C_{i,j}=\min_{k=0}^{n} (A_{i,k} + B_{k,j})\)。

则前面的转移方程可表示为 \(A_i=M_i*A_{i-1}\)。

进一步的,有 \(A_{n}=M_{n-1}*\dots*M_2*M_1*A_0\)。

根据各个周期转移方程相同,有

\[A_{2n}=M_{n-1}*\dots*M_2*M_1*A_n\\A_{3n-1}=M_{n-1}*\dots*M_2*M_1*A_{2n}\\ \dots
\]

联立起来得到:\(A_{mn}=(M_{n-1}*\dots*M_2*M_1)^m*A_0\)

其中 \(A_0=\begin{bmatrix}
0\\+\infin\\\vdots\\+\infin
\end{bmatrix}\),答案为 \(f_{mn,0}=(M_{n-1}*\dots*M_2*M_1)^m_{0,0}\)。

用矩阵快速幂计算即可,时间复杂度为 \(O(n \log m)\)。

代码

代码使用了封装矩阵和保险防越界的写法,直观易读。

long long 建议怕爆就全开,反正没有 MLE 的风险。

#include <bits/stdc++.h>
#define int long long using namespace std; const int N=25;
const int INF=1e18; int n,m;
int a[N],b[N]; struct mat{
int m[N][N]; int* operator [] (size_t i) {return m[i];}
const int* operator [] (size_t i) const {return m[i];} mat() {for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) m[i][j]=INF;}
mat operator * (const mat& b) const {
mat res;
for(int i=0;i<=n;i++)
for(int k=0;k<=n;k++){
if(m[i][k]==INF) continue;
const int a=m[i][k];
for(int j=0;j<=n;j++) res[i][j]=min(res[i][j],a+b[k][j]);
}
return res;
}
mat operator ^ (int b) const {
mat res,a=(*this);
res.init();
while(b){
if(b&1) res=res*a;
a=a*a,b>>=1;
}
return res;
}
void init(){
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
if(i==j) m[i][j]=0;
else m[i][j]=INF;
}
void build(int a,int b){for(int i=0;i<=n;i++) m[i+1][i]=a,m[i][i+1]=b;}
}; signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i]; mat M,T;
T.init();
for(int i=0;i<n;i++){
M.build(a[i],b[i]);
T=M*T;
}
cout<<(T^m)[0][0];
return 0;
}

CF351C Jeff and Brackets的更多相关文章

  1. cf352E Jeff and Brackets dp+矩阵快速幂(加法+min运算)

    题意大致是这样的,一共要放 m 段括号序列,每一段放 n 个括号,也就是放 n*m个括号,再每一段中的 n 个位置分别有放左括号和右括号的代价,问最终摆放出合法的括号序列的最小代价是多少. 另外保证, ...

  2. Codeforces 351C Jeff and Brackets 矩阵优化DP

    题意:你要在纸上画一个长度为n * m的括号序列,第i个位置画左括号的花费是a[i % n], 画右括号的花费是b[i % n],问画完这个括号序列的最小花费.n <= 20, m <= ...

  3. Brackets

    按下Ctrl + E("编辑")或退出编辑.Brackets将搜索项目下所有CSS文件 Ctrl/Cmd + Alt + P 打开即时预览功能 alt + command + O目 ...

  4. CF380C. Sereja and Brackets[线段树 区间合并]

    C. Sereja and Brackets time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. Brackets前端开发IDE工具

    Brackets是一个开源的前端开发IDE工具,网页设计师和前端开发人员必备的前端开发IDE工具. 它能够使你在开发WEB网站实时预览你的网页,目前版本只适用于Chrome浏览器可以实时预览效果 支持 ...

  6. POJ 题目1141 Brackets Sequence(区间DP记录路径)

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27793   Accepted: 788 ...

  7. CF149D. Coloring Brackets[区间DP !]

    题意:给括号匹配涂色,红色蓝色或不涂,要求见原题,求方案数 区间DP 用栈先处理匹配 f[i][j][0/1/2][0/1/2]表示i到ji涂色和j涂色的方案数 l和r匹配的话,转移到(l+1,r-1 ...

  8. 前端开发利器-Brackets IDE

    是什么? http://brackets.io/ A modern, open source text editor that understands web design. 现代, 开源的文本编辑器 ...

  9. 谷歌大神Jeff Dean:大规模深度学习最新进展 zz

    http://www.tuicool.com/articles/MBBbeeQ 在AlphaGo与李世石比赛期间,谷歌天才工程师Jeff Dean在Google Campus汉城校区做了一次关于智能计 ...

  10. Jeff Dean

    "--出自"关于 Jeff Dean 的事实" 其实,"关于 Jeff Dean 的事实"这个G+ 帖中描述的并非是真实的.不过有人大费周折为他建立了 ...

随机推荐

  1. 从 TCP 到 WebSocket:一次搞懂网络通信的三层演进

    引言 在现代应用开发中,网络通信是绕不开的核心议题.无论是构建传统的 Web 应用,还是开发需要实时交互的系统(如在线协作工具.金融行情推送.多人游戏),我们总会与 TCP.HTTP.WebSocke ...

  2. 2025年推荐6个好用的 Postman 替代工具

    在软件开发和API测试领域,Postman无疑是使用最广泛的工具之一.它凭借直观的界面.强大的功能以及丰富的社区支持,多年来一直备受欢迎. 然而,随着技术的发展和用户需求的多样化,Postman也暴露 ...

  3. ZKW 非递归线段树详解

    在算法竞赛和高性能计算场景中,线段树(Segment Tree) 是一个必修的数据结构.它可以在 $O(\log n)$ 时间内高效地完成区间查询与修改,比如:区间求和/最大/最小值查询配合区间加法/ ...

  4. 最近很火的Claude Code免费使用方法,亲测可用!

    最近微信群里和知乎上都在疯传一个免费使用Claude Code的方法,我看了好多公众号都在写,核心都是通过AnyRouter这个中转服务来实现. 先说核心思路 简单来说就是通过AnyRouter这个平 ...

  5. 如何在FastAPI中玩转STOMP协议升级,让你的消息传递更高效?

    扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 1. STOMP协议基础 STO ...

  6. ETL数据集成丨将SQL Server数据同步至Oracle的具体实现

    一.背景 在构建企业级数据架构时,将SQL Server数据库的数据同步至数仓数据库(如Oracle)是一项至关重要的任务.这一过程不仅促进了跨系统数据的一致性与可用性,还为数据分析.商业智能以及决策 ...

  7. Redis 主从复制、哨兵模式、Redis Cluster集群概述与原理

    以下是 Redis 主从复制.哨兵模式.Redis Cluster 的概述.原理及日常应用场景的详细说明: 一.Redis 主从复制 ​​概述​​: 这是 Redis 高可用架构的基础机制. 它允许一 ...

  8. MyEMS开源能源管理系统核心代码解读012

    本期解读: 能流图数据接口:myems/myems-api/reports/energyflowdiagram.py. 源代码链接:https://gitee.com/myems/myems/blob ...

  9. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-26- 操作Select下拉选择框 - 下篇(详细教程)

    1.简介 上一篇中宏哥主要讲解和分享了一下,我们常见或者传统的select下拉框的操作,但是近几年又出现了了一种新的select下拉框,其和我们传统的select下拉框完全不一样,那么我们如何使用pl ...

  10. Openstack 创建实例提示Failed to allocate the network(s)

    环境是 Windows 11 → VMware Workstation→ Ubuntu → VirtualBox → OpenStack Web界面 创建实例时 报错 Error: Failed to ...