Codeforces 351C Jeff and Brackets 矩阵优化DP
题意:你要在纸上画一个长度为n * m的括号序列,第i个位置画左括号的花费是a[i % n], 画右括号的花费是b[i % n],问画完这个括号序列的最小花费。n <= 20, m <= 1e7
思路:如果不管n和m的限制,这个题很好做,设dp[i][j]是到i位置,平衡因子是j的花费,dp[i][j] = min(dp[i - 1][j - 1] + a[i], dp[i - 1][j + 1] + b[i]),但是这样n * m到2e8级别,这是我们无法承受的。不过,我们可以发现一个性质:平衡因子的大小不会超过2 * n,因为如果超过2 * n,我们可以通过交换顺序而不改变答案,让平衡因子都小于2 * n。我们想一下dp的转移,我们发现可以用一次矩阵乘法来执行一次转移(设转移矩阵是C),那么C[j][j + 1] = a[i],C[j][j - 1] = b[i],那么乘一次这个矩阵就执行了一次转移,因为a和b数组是长度为n的循环,那么我们可以一次处理出n次转移的矩阵(由矩阵乘法的结合律可知),再用矩阵快速幂执行这样的n次转移m次,就得到了最终的答案。
代码:
#include <bits/stdc++.h>
#define INF 2e9
#define LL long long
using namespace std;
int a[30], b[30], N;
struct Matrix {
LL a[55][55];
Matrix(int x = INF) {
memset(a, 0x3f, sizeof(a));
for (int i = 0; i < N; i++)
a[i][i] = x;
}
friend Matrix operator * (const Matrix& A, const Matrix& B) {
Matrix ans;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
for (int k = 0; k < N; k++)
ans[i][j] = min(ans[i][j], A[i][k] + B[k][j]);
return ans;
}
Matrix operator ^ (int y) {
Matrix x = *this, ans(0);
for (; y; y >>= 1) {
if(y & 1) ans = ans * x;
x = x * x;
}
return ans;
}
LL*operator [](int x) {
return a[x];
}
const LL*operator [](int x) const {
return a[x];
}
}; int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &b[i]);
N = 2 * n + 1;
Matrix dp, A(0);
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
Matrix tmp;
for (int j = 0; j <= N; j++) {
if(j) tmp[j - 1][j] = a[i];
if(j < 2 * n) tmp[j + 1][j] = b[i];
}
A = A * tmp;
}
dp = dp * (A ^ m);
printf("%lld\n", dp[0][0]);
}
Codeforces 351C Jeff and Brackets 矩阵优化DP的更多相关文章
- 矩阵优化dp
链接:https://www.luogu.org/problemnew/show/P1939 题解: 矩阵优化dp模板题 搞清楚矩阵是怎么乘的构造一下矩阵就很简单了 代码: #include < ...
- bzoj 3120 矩阵优化DP
我的第一道需要程序建矩阵的矩阵优化DP. 题目可以将不同的p分开处理. 对于p==0 || p==1 直接是0或1 对于p>1,就要DP了.这里以p==3为例: 设dp[i][s1][s2][r ...
- HDU - 2294: Pendant(矩阵优化DP&前缀和)
On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend made by K ki ...
- [六省联考2017]组合数问题 (矩阵优化$dp$)
题目链接 Solution 矩阵优化 \(dp\). 题中给出的式子的意思就是: 求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数. 考虑朴素 \(dp\) ,定义状态 \(f[i][ ...
- [Sdoi2017]序列计数 矩阵优化dp
题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4818 思路 先考虑没有质数限制 dp是在同余系下的,所以\(f[i][j]\)表示前i个点, ...
- bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...
- 矩阵优化DP类问题应用向小结
前言 本篇强调应用,矩阵的基本知识有所省略(也许会写篇基础向...). 思想及原理 为什么Oier们能够想到用矩阵来加速DP呢?做了一些DP题之后,我们会发现,有时候DP两两状态之间的转移是定向的,也 ...
- 洛谷P3193 GT考试 kmp+矩阵优化dp
题意 求\(N\)位数字序列(可以有前导0)中不出现某\(M\)位子串的个数,模\(K\). \(N<=10^9,M<=20,K<=1000\) 分析 设\(dp[i][j]\)表示 ...
- $[TJOI2017]$ 可乐 矩阵优化$dp$
\(Sol\) 设\(f_i\)为到第\(i\)秒的方案数,显然\(f_i=\)在第\(i\)秒前爆炸的方案数+在第\(i\)秒爆炸的方案数+在第\(i\)秒停下的方案数+在第\(i\)秒走向下一个城 ...
随机推荐
- Redis-HA
Redis-HA部署 链接:https://pan.baidu.com/s/1cj5H9snQXqWaC0od1mUuig 提取码:jdqf 复制这段内容后打开百度网盘手机App,操作更方便哦 1. ...
- plsql exception
EXCEPTION aligns with BEGIN ... END blocks. There is no BEGIN inside your loop, so there should be n ...
- 使用CSS3的@media来编写响应式的页面
首先要知道,我们为什么要写自适应的页面(响应式页面) [直接看干货] 众所周知,电脑.平板.手机的屏幕是差距很大的,假如在电脑上写好了一个页面,在电脑上看起来不错,但是如果放到手机上的话,那可能就会乱 ...
- Java多线程状态切换
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11426573.html 线程状态 NEW RUNNABLE BLOCKED WAITING TIMED ...
- linux(一)vi和vim
vi 多模式文本编辑器 多模式产生的原因 四种模式 正常模式 插入模式 命令模式 可视模式 vi man vi vim vim正常模式 直接vim回车,或vim空格文件名回车 i进入插入模式 I(sh ...
- bzoj 2364
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2346 比较裸的最短路(' ' ) 水题又多了一道 #include <iost ...
- OC学习篇之---数组对象的引用计数问题和自动释放池的概念
之前一片文章中我们介绍了OC中的两个关键字@property和@synthesize的使用的使用: http://blog.csdn.net/jiangwei0910410003/article/de ...
- SCP-bzoj-1085
项目编号:bzoj-1085 项目等级:Safe 项目描述: 戳这里 特殊收容措施: A*(上下界剪枝). 答案上界:15. 答案下界:当前步数+当前状态剩余步数估价. 这里我们简单地设计估价函数为当 ...
- objective-c: Functions and static keyword
Functions function is a concept for C programming language, objective-c is entirely relies on C. To ...
- 线程同步(基于java)
java线程 同步与异步 线程池 1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成 ...