【算法】动态规划
文章平均质量分 81
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【BZOJ1003】【ZJOI2006】物流运输
【题目链接】点击打开链接【思路要点】显然,两次变换线路之间所走的路一定是所能走的最短路。记\(Cost_{i,j}\)表示第\(i\)天至第\(j\)天均能走的路中最短路的长度。那么可以设计简单DP,用\(F_{i}\)表示第一天到底\(i\)天的最小花费,那么显然有转移方程:$$F_{i}=min_{j=0}^{i-1}\{Cost_{j-1,i}原创 2018-01-12 11:32:29 · 395 阅读 · 0 评论 -
【BZOJ1004】【HNOI2008】Cards
【题目链接】点击打开链接【思路要点】题意表明,给定的洗牌方式在加上单位置换后(原本存在就不需要再加了)是一个置换群。考虑Burnside引理或Polya定理。注意到题目有颜色的使用次数的限制,因此不便使用Polya定理,考虑使用Burnside引理,求解每一个置换的本质不同的染色方案数的平均数。显然可以设计动态规划在\(O(N*R*G*B)\)的时空原创 2018-01-22 12:47:46 · 286 阅读 · 0 评论 -
【BZOJ3811】【UOJ36】【清华集训2014】玛里苟斯
【题目链接】BZOJUOJ【思路要点】首先,数集\(\{A,B\}\)等价于数集\(\{A,A\ Xor\ B\}\),且数集\(\{A,0\}\)等价于\(\{A\}\)。因此,我们可以先构建原数集的线性基,并删去多余的0。令\(M\)为线性基的元素个数,则\(M\)是\(O(LogMax\{a_i\})\)级别的。注意到题目保证答案小于等于\(2^{63}\),那么\(Max\{a_i\}\)...原创 2018-02-26 16:17:04 · 412 阅读 · 0 评论 -
【CodeForces】CodeForces Round #461 (Div. 2) 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Cloning Toys【思路要点】对于\(y=0\)或\(y=1\)的情况特殊考虑。其余情况满足\(x+y\)为奇数,且\(x+1≥y\)时答案为Yes,否则答案为No。时间复杂度\(O(1)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 5...原创 2018-02-12 10:33:21 · 341 阅读 · 0 评论 -
【CodeForces】CodeForces Round #466 (Div. 2) 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Points on the line【思路要点】枚举最后的区间,用前/后缀和计算区间外的点数。时间复杂度\(O(N+Max\{x_i\})\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 105;template <typename T&...原创 2018-02-26 10:24:08 · 238 阅读 · 0 评论 -
【CodeForces】CodeForces Round #462 (Div. 1 + Div. 2) 题解
【比赛链接】Div. 1Div. 2【题解链接】点击打开链接【Div.2 A】A Compatible Pair【思路要点】模拟过程,枚举玩家一删除的元素,并计算玩家二的最优策略,取最小值。时间复杂度\(O(N^{2}M)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 5005;template...原创 2018-02-16 20:43:07 · 356 阅读 · 0 评论 -
【CodeForces】CodeForces Round #463 (Div. 1 + Div. 2) 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Palindromic Supersequence【思路要点】将字符串正反各打印一遍。时间复杂度\(O(|A|)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 5005;template <typename T> void rea...原创 2018-02-22 10:46:55 · 551 阅读 · 0 评论 -
【CodeForces】Educational Codeforces Round 37 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Water The Garden【思路要点】按照题意模拟,或者简单计算一下均可。时间复杂度\(O(N)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 5005;template <typename T> void read(T &...原创 2018-02-12 21:08:20 · 391 阅读 · 0 评论 -
【USACO】2018 January Contest, Platinum题解
【比赛经历】先看完题,准备按顺序做。T1先写了一个\(O(NK^{2})\)的DP,交一发,得分8/10。仔细一想,\(O(NK)\)的做法好像可行,但稍微有点难写,决定卡常+骗分。把Max换成If语句,给循环变量加上人register,得分9/10。4次提交后,发现T的那个测试点满足\(K≥90\)、\(N≥80000\),针对性地骗分后,得到满分。此时时间刚过1h。T2想了一段原创 2018-02-07 10:45:13 · 1048 阅读 · 0 评论 -
【CodeForces】CodeForces Round #460 (Div. 2) 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Supermarket【思路要点】选取单价最低的店进行购买。时间复杂度\(O(N)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 5005;template <typename T> void read(T &x) { ...原创 2018-02-13 16:20:14 · 417 阅读 · 0 评论 -
【BZOJ3812】【UOJ37】【清华集训2014】主旋律
【题目链接】BZOJUOJ【思路要点】我们希望求出使得图强联通的边集数,这等价于求出所有边集数减去使得图不强连通的边集数。首先考虑一种非常暴力的做法,我们枚举最终的图缩点后的情况。那么,剩下的图必须是一个DAG,我们希望求出这张图在是DAG的情况下可行的边集数,并与每一个强连通分量加边方案数相乘,得到答案。后面的这个问题是原问题的一个子问题,递归对对应强联通分量的导出子图求解即可。问题在于求解一张...原创 2018-02-27 13:37:25 · 1222 阅读 · 0 评论 -
【BZOJ1233】【Usaco2009 Open】干草堆tower
【题目链接】点击打开链接【思路要点】有这样一个性质:对于最顶部的一些列干草堆,一定存在一种最优方案既满足高度最高,又满足底边最短。由这个性质,DP即可。DP转移可以被单调队列优化。时间复杂度\(O(N)\)。【代码】#include<bits/stdc++.h>using namespace std; #define MAXN 100005int main() { int n;...原创 2018-02-27 13:54:46 · 333 阅读 · 0 评论 -
【BZOJ4011】【HNOI2015】落忆枫音
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 100005#define MAXM 200005#define P 1000000007int n, m, x, y, ans;int s[MAXM], t[MAXM], d[MAXN], f[MAX...原创 2018-03-07 14:47:45 · 236 阅读 · 0 评论 -
【CodeForces662C】Binary Table
【题目链接】点击打开链接【思路要点】行的取反情况与每一列的初始元素可以看做若干个小于\(2^{N}\)的二进制数。注意到行很小,我们考虑先枚举每一行是否取反,令行的取反情况为\(Mask\)。那么,每列的二进制数\(x_i\)应当变成\(x_i\ xor\ Mask\)。令\(bits_i\)代表\(i\)的二进制表示1的个数,\(Mask\)的最小答案应当为\(\sum_{i=1}^{M}min...原创 2018-03-07 15:22:41 · 423 阅读 · 0 评论 -
【BZOJ1076】【SCOI2008】奖励关
【题目链接】点击打开链接【思路要点】补档博客,无题解(这个题也没人需要题解吧--)。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 20#define MAXK 105#define MAXP 32768int n, k;int s[MAXN];bool mark[MAXP][MAXK];doubl...原创 2018-03-07 15:27:16 · 218 阅读 · 0 评论 -
【BZOJ3814】【UOJ39】【清华集训2014】简单回路
【题目链接】BZOJUOJ【思路要点】直接进行\(Q\)次基于连通性的动态规划可以获得60分。注意到一定需要经过的边只有竖直的,而没有水平的。我们可以在完成一行的动态规划时顺便记录在第1行到第\(i\)行的区域中,第\(i\)行的插头为\(Mask\)的方案数以及第\(i\)行到第\(N\)行的区域中,第\(i\)行的插头为\(Mask\)的方案数。在询问时将经过某条边的配对的插头对应的方案数相乘...原创 2018-02-28 08:45:53 · 527 阅读 · 0 评论 -
【BZOJ1009】【HNOI2008】GT考试
【题目链接】点击打开链接【思路要点】先用KMP(或者暴力)求出匹配了\(i\)位后出现一个字母\(c\),最大能匹配多少位。然后矩阵乘法优化DP即可。时间复杂度\(O(M^3LogN)\)。【代码】#include<bits/stdc++.h>using namespace std;#define MAXLOG 31#define MAXN 55template <typ...原创 2018-02-18 16:25:55 · 256 阅读 · 0 评论 -
【BZOJ1010】【HNOI2008】玩具装箱toy
【题目链接】点击打开链接【思路要点】状态\(F_{i}\)表示把前\(i\)个玩具装箱的最小费用,\(S_{i}\)为\(C_{i}\)的前缀和。则有以下转移方程:$$F_{i}=min_{j=1}^{i}\{F_{j-1}+(i-j+S_{i}-S_{j-1}-L)^2\}$$令\(A_{i}=i+S_{i}-L\),\(B_{j}=j+S_{j-1}\),用\(F_{j,i}\)表示前\(i\...原创 2018-02-18 20:06:42 · 269 阅读 · 0 评论 -
【BZOJ1048】【HAOI2007】分割矩阵
【题目链接】点击打开链接【思路要点】平均值可以先求出来。记\(F_{lx,ly,rx,ry,cnt}\)表示将左上角为\((lx,ly)\),右上角为\((rx,ry)\)矩阵分成\(cnt\)份,各份的最小标准差之和的值。预处理二维前缀和,记忆化搜索即可。时间复杂度\(O((A+B)A^2B^2N^2)\)。【代码】#include<bits/stdc++.h>using name...原创 2018-02-18 20:38:54 · 267 阅读 · 0 评论 -
【BZOJ3572】【HNOI2014】世界树
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 300005#define MAXLOG 20#define INF 1000000000struct info {int pos, dist; };info dmin[MAXN], dnim[MAXN...原创 2018-03-15 10:39:10 · 229 阅读 · 0 评论 -
【BZOJ1426】收集邮票
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 10005double f[MAXN], g[MAXN];int main() { int n; scanf("%d", &n); double m = n; for (int i = 1;...原创 2018-03-15 13:28:52 · 307 阅读 · 0 评论 -
【CodeForces】CodeForces Round #464 (Div. 2) 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Love Triangle【思路要点】按照题意寻找三角形即可。即若存在一个点\(i\)使得\(f[f[f[i]]]==i\),答案为Yes,否则为No。时间复杂度\(O(N)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 5005;templ...原创 2018-02-18 11:05:43 · 1085 阅读 · 0 评论 -
【BZOJ3672】【UOJ7】【NOI2014】购票
【题目链接】BZOJUOJ【思路要点】令\(f_i\)表示从\(i\)出发到根节点的最小花费,\(s_i\)表示根节点到节点\(i\)的路径长度之和。那么,显然有方程:$$f_i=min_{s_i-l_i≤s_j}\{f_j+(s_i-s_j)p_i+q_i\}$$$$f_i=min_{s_i-l_i≤s_j}\{f_j-s_jp_i\}+s_ip_i+q_i$$其中\(j\)是\(i\)的一个祖...原创 2018-03-01 15:24:13 · 314 阅读 · 0 评论 -
【BZOJ3450】【TYVJ1952】Easy
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 300005char s[MAXN];long double f[MAXN], g[MAXN];int main() { int n; scanf("%d", &n); scanf("\n%...原创 2018-03-15 15:26:46 · 192 阅读 · 0 评论 -
【BZOJ2318】【SPOJ4060】Game with Probability Problem
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 5005#define DONE 1000double f[MAXN], g[MAXN];int main() { int T; scanf("%d", &T); while (T--) {...原创 2018-03-15 17:37:14 · 176 阅读 · 0 评论 -
【BZOJ3270】博物馆
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 25#define MAXP 405#define EPS 1e-7bool mp[MAXN][MAXN];double p[MAXN], a[MAXP][MAXP], x[MAXP];int d[M...原创 2018-03-16 09:17:38 · 360 阅读 · 0 评论 -
【BZOJ3036】绿豆蛙的归宿
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 100005struct edge {int dest, len; };vector <edge> a[MAXN];int n, m, d[MAXN], o[MAXN], q[MAXN], t...原创 2018-03-16 10:07:11 · 633 阅读 · 0 评论 -
【BZOJ4723】【POI2017】Sabota?
【题目链接】点击打开链接【思路要点】显然的一点是至少有一种最坏情况,叛徒是叶子结点。令\(dp_i\)表示在最坏情况下,保证节点\(i\)不会成为叛徒的\(x\)的最小值,树形DP即可,转移比较显然。时间复杂度\(O(N)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 500005;templa...原创 2018-03-16 10:37:49 · 187 阅读 · 0 评论 -
【BZOJ4008】【HNOI2015】亚瑟王
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 255#define MAXM 255double p[MAXN], d[MAXN];double f[MAXN][MAXM], q[MAXN][MAXM];int main() { int T; ...原创 2018-03-16 10:41:04 · 318 阅读 · 0 评论 -
【CodeForces】CodeForces Round #465 (Div. 2) 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Fafa and his Company【思路要点】求\(N\)的因数个数减1,乱做就行。时间复杂度\(O(N)\)或\(O(\sqrt{N})\)【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 5005;template <typename...原创 2018-02-23 20:13:29 · 288 阅读 · 0 评论 -
【BZOJ3241】【UOJ125】【NOI2013】书法家
【题目链接】BZOJUOJ【思路要点】把字符画从左到右分成若干个阶段,记录上一列的内容,按列DP即可。多数转移都比较显然,在N中部处的转移需要用到一定的前缀最大值的技巧。时间复杂度\(O(N^2M)\),常数较大。【代码】#include <bits/stdc++.h>using namespace std;const int MAXN = 155;const int MAXM ...原创 2018-03-10 11:22:07 · 238 阅读 · 0 评论 -
【BZOJ2616】SPOJ PERIODNI
【题目链接】点击打开链接【思路要点】笛卡尔树DP,先构建笛卡尔树。在本题中,我们可以把笛卡尔树的一个节点看做一个矩形,父节点的矩形在横坐标上包含子节点的矩形。记\(F_{i,j}\)表示在\(i\)的子树中放置\(j\)个车的方案数。转移时先FFT暴力合并子树信息:\(tmp_{i}=\sum_{j=0}^{i}F_{lc,j}*F_{rc,i-j}\)。然后再处理当前节点对应的矩形的转移:\(F...原创 2018-02-24 11:02:43 · 952 阅读 · 1 评论 -
【BZOJ3244】【UOJ122】【NOI2013】树的计数
【题目链接】BZOJUOJ【思路要点】显然,顶点的编号是无关紧要的,不妨令BFS序为\(1,2...N\)。我们在BFS序上分层,即每次我们考虑下一层会包含哪些连续的点。令此时的DFS序为\(dfs_i\),\(i\)在DFS序中的位置为\(pos_i\),当前层包含\([L,R]\)且下一层包含\([R+1,X]\)。层与层之间合法的划分应该满足\(pos_{R+1}>pos_{L}\)且...原创 2018-03-04 16:21:00 · 276 阅读 · 0 评论 -
【BZOJ4831】【Lydsy2017年4月月赛】序列操作
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>#define MAXN 1000005using namespace std;int n, a[MAXN];long long f[MAXN];int main() { int T; scanf("%d", &T); while (T--) { sc...原创 2018-03-17 17:37:18 · 193 阅读 · 0 评论 -
【BZOJ3790】神奇项链
【题目链接】点击打开链接【思路要点】用Manacher算法求出每个字符为中心的极长回文子串,显然,选取更短的回文子串不会使答案更优。因此,问题转化成了“有若干个区间,至少选取多少个才能使它们的并是\([1,N]\)”。用线段树优化DP即可。时间复杂度\(O(NLogN)\)。【代码】#include<bits/stdc++.h>using namespace std; #defin...原创 2018-02-25 14:22:55 · 418 阅读 · 0 评论 -
【UOJ311】【UNR #2】积劳成疾
【题目链接】点击打开链接【思路要点】笛卡尔树DP,记\(F_{i,j}\)表示长度为\(i\)的区间中所有数的最大值小于等于\(j\),所有方案的贡献之和。考虑枚举区间最大值第一次出现的位置,则有:\(F_{i,j}=F_{i,j-1}+\sum_{pos=1}^{i}w_j^{min(pos,i-k+1)-max(1,pos-k+1)+1}*F_{pos-1,j-1}*F_{i-pos,j}\)...原创 2018-02-25 16:16:14 · 298 阅读 · 0 评论 -
【CodeForces】CodeForces Round #467 (Div. 1 + Div. 2) 题解
【比赛链接】Div.1Div.2【题解链接】点击打开链接【Div.2 A】Olympiad【思路要点】答案为原数集中除去所有0以外数的种类数,哈希计数即可。时间复杂度\(O(N+Max\{a_i\})\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 1005;template <typena...原创 2018-03-05 20:29:18 · 338 阅读 · 0 评论 -
【BZOJ5205】【LOJ6301】「CodePlus 2018 3 月赛」白金元首与莫斯科
【题目链接】点击打开链接【思路要点】考虑从前向后、从后向前各做一次状压DP,在询问时合并信息。注意到问题等价于用\(1*2\)和\(1*1\)的棋子填满棋盘,我们可以把\(1*1\)的棋子一并在状压DP时考虑进去。合并答案时只需要枚举\(2^N\)个状态,将满足条件的DP值相乘,累加入答案即可。举例来说,在下图中,合法的状态应当满足在标号为4处已经填上棋子,在标号和为3的绿色和蓝色方格,是否填上棋...原创 2018-03-07 12:36:22 · 694 阅读 · 0 评论 -
【CodeForces300D】Painting Square
【题目链接】点击打开链接【思路要点】首先,很重要的一点:“The bear chooses some row and some column inside the chosen square.”一句中,“Some”一词应译为“某个”而不是“一些”。很显然,只有边长为大于等于3的正方形能被操作,并且每一次的操作方式是唯一的:沿中心将正方形分成四个等大的小正方形。我们令操作次数为\(M\),表示大小为...原创 2018-03-13 12:37:27 · 391 阅读 · 0 评论 -
【CodeForces】CodeForces Round #468 (Div. 1 + Div. 2) 题解
【比赛链接】Div.1Div.2【题解链接】点击打开链接【Div.2 A】Friends Meeting【思路要点】模拟两个角色向中间移动即可。时间复杂度\(O(B-A)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 100005;template <typename T> void...原创 2018-03-06 15:41:31 · 328 阅读 · 0 评论