CF351C Jeff and Brackets
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\) 个左括号未被匹配的最小代价。
显然有:
\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\),我们设
\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_{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的更多相关文章
- cf352E Jeff and Brackets dp+矩阵快速幂(加法+min运算)
题意大致是这样的,一共要放 m 段括号序列,每一段放 n 个括号,也就是放 n*m个括号,再每一段中的 n 个位置分别有放左括号和右括号的代价,问最终摆放出合法的括号序列的最小代价是多少. 另外保证, ...
- Codeforces 351C Jeff and Brackets 矩阵优化DP
题意:你要在纸上画一个长度为n * m的括号序列,第i个位置画左括号的花费是a[i % n], 画右括号的花费是b[i % n],问画完这个括号序列的最小花费.n <= 20, m <= ...
- Brackets
按下Ctrl + E("编辑")或退出编辑.Brackets将搜索项目下所有CSS文件 Ctrl/Cmd + Alt + P 打开即时预览功能 alt + command + O目 ...
- CF380C. Sereja and Brackets[线段树 区间合并]
C. Sereja and Brackets time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Brackets前端开发IDE工具
Brackets是一个开源的前端开发IDE工具,网页设计师和前端开发人员必备的前端开发IDE工具. 它能够使你在开发WEB网站实时预览你的网页,目前版本只适用于Chrome浏览器可以实时预览效果 支持 ...
- POJ 题目1141 Brackets Sequence(区间DP记录路径)
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27793 Accepted: 788 ...
- CF149D. Coloring Brackets[区间DP !]
题意:给括号匹配涂色,红色蓝色或不涂,要求见原题,求方案数 区间DP 用栈先处理匹配 f[i][j][0/1/2][0/1/2]表示i到ji涂色和j涂色的方案数 l和r匹配的话,转移到(l+1,r-1 ...
- 前端开发利器-Brackets IDE
是什么? http://brackets.io/ A modern, open source text editor that understands web design. 现代, 开源的文本编辑器 ...
- 谷歌大神Jeff Dean:大规模深度学习最新进展 zz
http://www.tuicool.com/articles/MBBbeeQ 在AlphaGo与李世石比赛期间,谷歌天才工程师Jeff Dean在Google Campus汉城校区做了一次关于智能计 ...
- Jeff Dean
"--出自"关于 Jeff Dean 的事实" 其实,"关于 Jeff Dean 的事实"这个G+ 帖中描述的并非是真实的.不过有人大费周折为他建立了 ...
随机推荐
- 调试栈 linux
参考连接 bluez 中有对于backtrace 的使用.所以看了一下这篇文章比较好.转载了 参考:CSDN大牛
- Product-Mechanics: 玻璃:开模+ 浇筑 量产: 高硼硅玻璃/容器/器皿
Product-Mechanics: 塑料:开模+挤塑量产 高硼硅玻璃: 专利: https://www.xjishu.com/zhuanli/25/201910127975.html 例如化学仪器设 ...
- SciTech-Logic:逻辑学-Introduction to Logic: Irvine - 5.2 Class and Statement 类与直言命题
类与直言命题 亚里士多德三段论逻辑,主要探讨的是关于不同对象类之间相互关系的论证. Class:类 Class类,指的是共有certain specific property:某种特定属性的objec ...
- POLIR-Society-Management-CNO5R+Leading: 管理Leading(引领工作)的几个要点:立场(目标人群)+金钱价值观+需求+服务产品+管理控制_复杂和不确定性+领导力{做人做事思想}+管理{ 三管五带七抓 }
POLIR-Society-Management-Leading: 管理Leading(引领工作)的几个要点: Customer SATISFACTION: 我们最终为"何种目标人群&quo ...
- 10款高效研发进度管理工具深度测评:ONES/Jira/Trello 谁更适合你的团队?
本文对10款主流进度管理工具进行深度测评,涵盖 ONES.Jira.Trello.ClickUp.Monday.com.Asana.Notion.Azure DevOps.YouTrack 等,从工具 ...
- 在SqlSugar的开发框架的Vue3+ElementPlus前端中增加对报表模块的封装处理,实现常规报表的快速处理
在我们开发业务系统的时候,往往都需要一些数据报表进行统计查看,本篇内容介绍如何在实际的前端中对报表内容进行的一些封装操作,以便提高报表模块开发的效率,报表模块的展示主要是结合Vue3中比较广泛使用的e ...
- Java注解底层竟然是个Map?
案例介绍 案例一:普通注解用法 下面的代码定义了一个注解 @Test,然后在 AnnotationTest 中获取到这个注解,然后打印出它 value() 方法的值. @Retention(Reten ...
- 云原生应用开发“12-Factors”
12 Factor 简介 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS).12-Factor 为构建如下的 SaaS 应用提供了方法论: 使用标准化流程自动配置, ...
- P8328 [COCI 2021/2022 #5] Usmjeravanj
P8328 [COCI 2021/2022 #5] Usmjeravanj 本题的实际难度和通过数不是相符. 实际思维难度:蓝 代码实现难度:绿 部分1.简化题意 存在两条河流,假设分别叫做① 和 ② ...
- Vibecoding 新体验:实测 Qwen3 Coder 代码生成效果
Qwen3 Coder 这款编程大语言模型冲榜全球开源模型第一, 各项指标甚至不输 Claude 等闭源模型, 除了生成效果外, 1M 的超长上下文在我们看来也是一个大亮点,这意味着通过多轮对话构建复 ...