
DP
bestFy
世界上最最最渣的oier.
展开
-
codeforces790B - Bear and Tree Jumps
题面在这里题目大意:有一棵树,在树上每一步 可以跳k条边。设f(s, t)表示从s到t的最小步数。求所有点对的f值之和。先考虑k = 1的情况,那么就是求树上任意两点的距离之和,相当于求每一条边被经过的次数,答案应该就是任意一条边左右两边点数的乘积之和。然后如果k != 1,那么在一条路径长度不被k整除的时候就会出现问题,因为有一个余数,这个余数我们需要再走一步。处理这原创 2017-11-17 21:58:02 · 396 阅读 · 0 评论 -
Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined)
比赛链接qaq这场比赛rating暴涨(小号)A. Perfect Squares题意:求最大的不是完全平方数的数。做法:直接从大到小排序即可。有一个很有趣的东西。。 就是这道题是有负数的,按理来讲是要判一下的因为负数没法sqrt。 但是我没判也可以过。。。 我后来发现cf的评测机好像sqrt一个负数会返回-2147483647,然后-21474836原创 2018-01-22 00:41:49 · 386 阅读 · 0 评论 -
poj3691 DNA repair
题面在这里题意:给你N (1 ≤ N ≤ 50)个只由“A”,“G”,“C”,“T”四个字母组成的病毒串(len给你一个文本串(len做法:ac自动机+dp。 将病毒串建立ac自动机,题目要求的即是文本串不能经过任何ac自动机上的单词节点。 f[i][j]表示第i个节点,当前在文本串第j位,最少改变多少个字符。 枚举下一位是什么字母转移。 可以用记搜实现。原创 2018-01-13 15:01:34 · 367 阅读 · 0 评论 -
hdu3247 Resource Archiver
题面在这里题意:给你n个资源串,m个病毒串,都由01组成。需要构造一个新串使得n个资源串都是这个新串的子串,并且该新串不包含任意一个病毒串。求新串的最小长度。 2 每个资源串长度做法:对于所有的病毒串和资源串,把它们都扔进AC自动机处理。 对于每一个节点处理出是否含病毒,以及包含了哪几个资源串(状压)。 f[i][j]表示当前使用的资源串状压为i,现在在j这个节点的原创 2018-01-25 18:47:04 · 354 阅读 · 0 评论 -
bzoj1833: [ZJOI2010]count 数字计数
题意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。做法:显然是数位DP,我来写个dfs题解吧首先区间[a,b]内的数量可转化为[1,b]-[1,a-1]。考虑求一个数码出现的次数,比如1出现的次数。我们首先想爆搜怎么写,然后加一个记忆化即可。对于一个长度为len的数,从高位到低位枚举它每一位上的数字,然后计算1出现的次数。哪些东西要原创 2018-01-09 22:45:37 · 350 阅读 · 0 评论 -
codeforces730F - Ber Patio
题面在这里题意:你要按顺序买n" role="presentation" style="position: relative;">nnn个物品,每个物品的花费分别为a1...an" role="presentation" style="position: relative;">a1...ana1...ana_1...a_n。初始时有一张价值为b" role="presentation" s原创 2018-02-02 22:01:25 · 358 阅读 · 0 评论 -
bzoj1880: [Sdoi2009]Elaxia的路线
题面在这里题意:求一个无向图中,两个点对最短路的最长公共路径。 注意给出的x1,y1和x2,y2不一定是从x走到y,可以是y走到x。做法:首先无脑跑最短路QAQ.. 事实上,我们要把以x1,y1,x2,y2为起点的最短路都跑出来。然后对于一条边u,v,边权为w,假如dis[s-u]+dis[v-t]+w == dis[s-t],则u-v这条边是在s-t的最短路上的。原创 2018-01-28 14:27:20 · 328 阅读 · 0 评论 -
ARC#058F Iroha Loves Strings(贪心+字符串处理+dp预处理)
题面在这里 这题网上找不到题解啊。。于是我就自己对着某大佬的ac代码看了inf小时后终于(假装)懂了。。题意小C有NNN个字符串s1,s2,s3,...,sNs1,s2,s3,...,sNs_1, s_2, s_3, ..., s_N,并且他准备选择一些字符串顺次连接起来。问所有能得到的字符串中长度为KKK的字典序最小的。N≤2000,K≤104N≤2000,K≤104N ≤ 200...原创 2018-03-09 16:04:09 · 939 阅读 · 1 评论 -
loj#2325. 「清华集训 2017」小 Y 和恐怖的奴隶主 (矩阵快速幂优化概率dp)
吐槽请无视 哇塞我终于开始更博客了!感不感动!兴不兴奋!%¥#%$#@*&.... emm事实上是因为csdn的LaTeX终于修复好了。。ps.之后的题解可能都会相对简略。 并且养成标题上加算法的好习惯,,题面在这里题意:维护一个集合,初始有两个数 {+∞,m}{+∞,m}\{+\infty,m\} 。 进行 nnn 次操作,每次随机选一个数,把它减一;...原创 2018-03-06 00:24:46 · 514 阅读 · 0 评论 -
codeforces766E - Mahmoud and a xor trip
题面在这里题意:给一棵树,每个点有点权。 询问任意两点路径上点权的异或和。做法:由于是异或和,可以先枚举每一位,分别DP。 记f[u][0/1]为以u为根的子树中,路径异或值为0/1的点对数量。 ans统计时利用乘法原理。然后要再乘上1<<p1<<p(p是当前的位数)。 推f[]的时候按照当前位的0/1分类讨论一下。代码:/**********************************原创 2018-01-03 15:44:58 · 376 阅读 · 0 评论 -
uva11468 Substring
题面在这里题意:给一些模式串。 再给n个字符和它们出现的概率,问用这些字符随机构造一个长为L的字符串,不包含任意一个模式串的概率是多少。做法:用模式串建ac自动机。 然后问题相当于从字典树的根开始跑,不经过任意一个单词结尾的节点跑L步的概率。 我们把单词结尾的节点打标记。假如一个点对应的fail节点也打了标记,它也要打上标记,因为以这个节点为结尾的后缀在模式串中出现过原创 2018-01-11 15:59:18 · 362 阅读 · 0 评论 -
bzoj1019: [SHOI2008]汉诺塔
题面在这里首先f[i][j]表示第i个柱子上j个盘,移到g[i][j]上需要的步数。g[i][j]保存上述状态下移到哪个柱子。假设现在的状态是第x个柱子i个盘,设y = g[x][i-1],k = 3-x-y(k是剩下一个盘)然后我们考虑操作:肯定是把x上的i-1个先移到y,剩下一个移到k,再移动y上的i-1个盘。至于y上i-1个盘怎么移,需要分类讨论:如果g[y][i原创 2017-11-16 20:08:40 · 280 阅读 · 0 评论 -
bzoj1042: [HAOI2008]硬币购物
题面在这里 做法: 暴力dp显然要挂。 我们考虑先完全背包预处理出无限制的方案数。 然后考虑只有一个硬币有限制的情况。我们需要的答案应该等于f[tot]−f[tot−(bi+1)∗ai]f[tot] - f[tot-(b_i+1)*a_i],假定tot是总钱数,a是钱的面值,b是限制。至于为什么的话,一大佬题解里讲得挺清楚。链接 那么多种硬币都有限制就用一下容斥原理即可。/********原创 2017-12-14 15:39:08 · 253 阅读 · 0 评论 -
codeforces841E - On the Bench
题面在这里 题目大意: 给一个长度为n序列,n 做法: 很巧妙的DP+组合计数。 需要将数字分组。我们考虑将所有数字去掉平方因子后的数(相当于一个数开根号化成最简根式后根号里的数)相同的分到一组。 这个其实等价于,将所有数分解质因数后质因子的指数奇偶性相同的分到一组。 还等价于,两两之间相乘会变成平方数的分成一组。(额说到这了才是重点咳咳咳。。之前的帮助理解) 于是将问题转化为,原创 2017-12-06 11:39:22 · 360 阅读 · 0 评论 -
codeforces834D - The Bakery
题面在这里题目大意:给一个长度为n的序列(n DP+线段树。先设方程:f[i][j][k]表示前i个数,分成j个连续子序列,最后一个序列从k开始的最大价值和。两个转移:① 第i个和最后一个序列合并。如果k~i-1之间没有出现a[i],那么f[i][j][k] = f[i-1][j][k]+1.② 第i个作为新的一个序列的开始。在f[i-1][j-1][p]原创 2017-12-02 00:13:18 · 419 阅读 · 0 评论 -
bzoj1044: [HAOI2008]木棍分割
题面在这里 做法: 第一问直接二分答案。 第二问DP,我们定义f[i][j]f[i][j]表示前i根木棍分为j块的方案数。 首先要O(n)O(n)预处理出nxt[i]nxt[i]表示满足a[i]−a[k−1]<=resa[i]-a[k-1]<=res的最小的k。注意这里的a[]a[]是题目中数据的前缀和。然后转移方程是这样: f[i][1]=(a[i]<=res),f[i][j]=∑k=n原创 2017-12-14 22:07:25 · 237 阅读 · 0 评论 -
bzoj1046: [HAOI2007]上升序列
题面在这里做法: 先预处理出f[i]f[i]表示第i个数字开始的最长上升子序列长度。这个相当于倒着求一遍最长下降子序列。 然后贪心。对于每一个询问lenlen,我们从左到右扫描,若当前的f[i]>=lenf[i]>=len且ai>lasta_i>last,则输出这个数并更新为lastlast,然后len−−len --。直到len=0len=0为止。话说O(nlogn)O(nlogn)的lisl原创 2017-12-15 13:48:44 · 229 阅读 · 0 评论 -
bzoj1270: [BeijingWc2008]雷涛的小猫
题面在这里 水题again and again感觉自己已经颓得不行做法: DP。保存一个maxmax避免O(n)O(n)转移。别的没啥好说的。/************************************************************* Problem: bzoj 1270 [BeijingWc2008]雷涛的小猫 User: fengyuan原创 2017-12-15 17:22:30 · 325 阅读 · 0 评论 -
bzoj1491: [NOI2007]社交网络
题面在这里 做法: floyd+DP。 设w[i][j]w[i][j]表示i−ji-j的最短路,f[i][j]f[i][j]表示i−ji-j最短路方案数。 转移就是f[i][j]+=f[i][k]∗f[k][j]f[i][j]+=f[i][k]*f[k][j] 然后再枚举每个点计算一下好了= =/***********************************************原创 2017-12-16 00:13:43 · 270 阅读 · 0 评论 -
Codeforces Round #471 (Div. 2)
比赛链接QAQ终于补完了这场的题。。感觉后面几题还都挺好的就写个(非常)简略的总结叭。A. Feed the cat简单贪心+模拟。#include<bits/stdc++.h>#define rep(i,x,y) for (int i=(x); i<=(y); i++)#define ll long longusing namespace std;...原创 2018-03-27 23:23:41 · 505 阅读 · 0 评论