dp
zzk_233
这个作者很懒,什么都没留下…
展开
-
bzoj 1009 GT考试(dp+KMP)
我的算法和大部分的题解算法有些不同。。。。算法来源参照http://acm.hdu.edu.cn/showproblem.php?pid=3689那么这道题的思想可以转为求,当准考证号的长度为i时不吉利数字匹配的长度为j,那么设f[i][j]表示当前状态的方案数,则有转移f[i][kmp(j-1,k)]+=f[i-1][j-1];j为长度,因为kmp是从0开始的,所以他的位置为j-1...原创 2018-09-26 15:21:28 · 154 阅读 · 0 评论 -
bzoj 1042: [HAOI2008]硬币购物
因为有了个数的限制,我们可以考虑容斥原理,首先对于整体求完全背包,dp值代表值为i的选择方式。那么有一个超过限制的情况就是选择这个面值的多了一个,那么贡献就是c[i]*(d[i]+1),所以应该减去dp[s-(c[i]*(d[i]+1))]。利用容斥,应该减去奇数个超限制的,加上偶数个超限制的。#include<cstdio>#include<cmath>...原创 2018-11-07 19:12:48 · 127 阅读 · 0 评论 -
codeforces 985C3 Encryption (hard)
跟前面的两道题不同的就是数据变大了,并且变成了求最小值,首先考虑dp设f[i][j]表示前i个位置里分了j份的最小值。sum[i]表示到i为止val[i]的和 mod p的值。但是这样会超时,所以考虑优化掉一维,对于式子分析,可以发现后面的 mod p有两种情况,拆开式子分别为这个可以用两个树状数组维护,每次dp的时候,当前的j可以由≤s[i]的第一个树状数组和...原创 2018-11-02 14:47:55 · 111 阅读 · 0 评论 -
bzoj 1222 产品加工
感觉是很套路的题,对于两个或者多个状态的更新时,可以把一个设为维度,本题设dp为dp[i][j]表示第i个产品A加工时间为j时,B的加工时间是多少,对于转移有三种情况1.由A来做,2.由B来做,3.一起做,对于没有的情况要赋成正无穷,因为当前为一定要更新,所以可以先从1更新。初值为dp[0][0]=0,因为是背包,可以滚掉第一维。#include<cstdio>...原创 2018-11-06 15:57:59 · 147 阅读 · 0 评论 -
codeforces 1015F Bracket Substring
题目大意:给出一个序列s,求出长度为2*n的序列中包含s的常规括号序列。常规括号序列就是指左右括号顺序和数量相等。如果没有左右括号的限制,可以直接参考bzoj1009GT考试我的更新思路:https://blog.csdn.net/zzk_233/article/details/82852615设dp[i][j]代表当前长度的串比配了j长度的方案数,更新的时候就是下一个字符为 "(" 或者...原创 2018-11-01 20:19:56 · 207 阅读 · 0 评论 -
codeforces 1065D Three Pieces
题目大意:给出一个n*n的图,每个点有一个值,构成一个1-n*n的序列,要求按照1-n*n的顺序走完全图,每走一步消耗1时间,有三种走法,按照国际象棋里的象,车,马。更换一次走法消耗1时间,求走到终点的最小时间,和最小时间下消耗最小转换次数看这数据范围n≤10,就是一道搜索题。设五维dp。具体解释在代码里了。 #include<cstdio>#include<...原创 2018-10-31 18:55:23 · 178 阅读 · 0 评论 -
NOIP十连测 涂色游戏
这是一道玄学组合数和神仙思路。。。题目大意:给出一个n*m的网格,每个格子里只能涂一种颜色,一共有p中颜色,要求任意相邻两列都出现了至少q种颜色的方案数。n≤100,m≤,q≤p≤100。看这m的范围,很容易想到矩阵乘法,所以可以先考虑递推式。设dp[i][j]表示前i列最后一列共有j种颜色的方案数。那么显然可以得到dp[i][k]=dp[i-1][j]*ans[j][k]...原创 2018-10-29 18:49:34 · 418 阅读 · 0 评论 -
bzoj 1023: [SHOI2008]cactus仙人掌图
起了个仙人掌的名字但是它并不是仙人掌(的做法)。。。。首先这个图确实是个仙人掌。。。然后如果只有树的话就可以只跑树上最长链(dfs两遍)。然而有一些比较烦人的环。所以我们考虑把它优化掉。所以把树上最长链以dp的形式实现。dp[i]代表这个点上的最长链。然后环怎么办呢,可以首先造一个dfs树,然后把环的最高点作为这个环用来dp的点,其余的点的互相连通情况在判环的过程中进行,之后这...原创 2018-10-10 20:29:26 · 148 阅读 · 0 评论 -
bzoj 1499 [NOI2005]瑰丽华尔兹(单调队列优化dp)
正常的dp就是往哪个方向走就是怎么加。但是这样明显超时。所以我们想把时间限在k之内。所以每次的k都用单调队列维护最大值每次都计算整行/列,但是如果长度大于这次的步数,就剔除队列。#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>using names...原创 2018-10-08 21:08:50 · 172 阅读 · 0 评论 -
bzoj 4715 囚人的旋律 (dp)
这是一个逆序对图。。我们可以设一个数组a表示每一个位置的权值。它只有在存在逆序对时才连边,而即是独立集又是覆盖集的情况就是这些点之间没有连边,并且其他的数字都是他们的逆序对。。所以可以考虑成数列的形式。设f表示到当前点为止的方案数(选择当前点),维护tmp为a[tmp]>a[i]&&a[i]<a[j]。。。所以就是a[tmp]>a[j]的最小值,因为只...原创 2018-10-08 20:21:27 · 193 阅读 · 0 评论 -
bzoj 1415: [Noi2005]聪聪和可可(概率dp)
吐槽鬼体面。。到底问的是什么。。。其实问的不是时间,是步数的期望。首先预处理一个dis数组,dis[x][y]表示从x到y的最短路步数因为边权为1,可以bfs,当然我写的spfa(我懒)。从题目我们可以发现,zhx是一定会 被 吃了的,毕竟机器人走两步zhx走一步,所以只需考虑他们不断逼近的情况。设f[x][y] 表示这一秒开始时,机器人在x,zhx在y时,机器人吃到zhx的期望天数,...原创 2018-10-04 15:45:30 · 145 阅读 · 0 评论 -
bzoj 1812 [IOI2005] riv (树形dp,树上背包)
这道题比较有难度。。。首先可以想到f[i][k]表示i点的子树中用了k个伐木场。但是这显然没法转移。那么我们加上一维,f[i][j][k]表示i点的子树内用了k个伐木场并且上一个用的位置为j,而当前点可选可不选(看第二维的状态),之后用子树更新即可合并的时候和更新的时候要特殊考虑i==j的情况。枚举这个点其他子树内用了w个,这个子树为k-w当不选择这个点时f[i][j][k]=mi...原创 2018-10-04 15:36:45 · 130 阅读 · 0 评论 -
[USACO18OPEN]Talent Show(01分数规划)
学习ing。。什么鬼互测题系列。。。原创 2018-10-11 15:34:16 · 186 阅读 · 0 评论 -
bzoj 1030 文本生成器(AC自动机+dp)
前置知识ac自动机或者trie图。根据题意需要求出文章中包含1个或更多的字符串的数量。但是这明显很难求,所以求出所有方案减去不包含的数量。考虑dp,设f[i][j]表示第i位置时为AC自动机(trie图)上第j个字符没有匹配的方案数,如果这个字符的下一个字符没有匹配就可以转移,预处理那些字符可以匹配只需在求fail指针的时候继承一下fail指针的状态即可。我写的trie图代码...原创 2018-09-26 16:19:04 · 127 阅读 · 0 评论 -
codeforces939F Cutlet
题目大意:有2*n的时间去煎一片肉,其中有k个不相交区间,在这些区间里可以翻面,求最后每面都煎n分钟的最小翻面次数。有一个显而易见(exm???)的思路,设dp状态为dp[i][j]表示在第i分钟朝上的面煎了j分钟,那么转移就是dp[i][j]=min(dp[i-1][j],dp[i-1][i-j]+1),就是上一秒不翻,或者上一秒翻了,并且之前向上的时间为j,现在就是i-j。但是这显...原创 2018-11-05 18:33:47 · 163 阅读 · 0 评论