
DP真的不会想
文章平均质量分 69
stone41123
一名苦逼的OIer,欢迎交朋友。。。
展开
-
BZOJ3566 概率充电器
LinkDifficulty算法难度4,思维难度5,代码难度4Description给定一棵树,每个点有直接充电的概率,每条边有传递充电的概率求被充电的点的个数的期望值1≤n≤5×1051\le n\le 5\times 10^51≤n≤5×105Solution换根dp裸题咯定义dpxdp_xdpx代表点xxx充不上点的概率,ans=n−∑dpians=n-\sum dp_i...原创 2018-11-14 09:38:10 · 218 阅读 · 0 评论 -
【NOIP2017提高A组集训10.24】合影
Description题目背景 热烈庆祝北京师范大学附属实验中学成立100周年! 问题描述 经过一天的忙碌,志愿者们结束了他们的工作,准备站在一排合影留念。 现在总共有n名志愿者留下来准备合影。不过,进程并不是那么顺利,有些同学提出了一些奇奇怪怪的要求(每个人最多只会提出一个):他必须站在另外一个同学的左边(不一定相邻),仁慈的老师满足了他们的要求。原创 2017-10-24 14:29:55 · 736 阅读 · 0 评论 -
10.14TG T3 tree
这个题是树形dp 我们可以记录两个量,sum和cnt sum(x)代表x的子树中的合法路径长度总和,cnt(x)代表x的子树中的合法路径数量。 那么就好dp了:#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define ll原创 2017-10-15 11:18:35 · 238 阅读 · 0 评论 -
[bzoj1055][HAOI2008]玩具取名(区间dp)
传送门 数据范围200,O(n3)O(n^3)数据范围,还有替换,可以联想到区间dp。 读入时记录下来所有的替换方案,然后就可以记忆化搜索了。 状态:f(l,r,c)表示[l,r]替换成字符c是否可行f(l,r,c)表示[l,r]替换成字符c是否可行 然后dp即可。 代码:#include<cstdio>#include<cstring>#include<iostream>#incl原创 2017-10-05 19:48:48 · 681 阅读 · 0 评论 -
[bzoj1009][HNOI2008]GT考试(dp+矩阵加速+KMP)
传送门 这个题dp还是很好想的。这个题dp还是很好想的。 f(i,j)表示第i位,模式串匹配到第j位的方案数f(i,j)表示第i位,模式串匹配到第j位的方案数 f(i,j)=∑k可转移到jf(i−1,k)f(i,j)=\sum_{k可转移到j}f(i-1,k) 如果你已经构造好一个矩阵A,A(i,j)代表i是否可以转移到j如果你已经构造好一个矩阵A,A(i,j)代表i是否可以转移到j 就可原创 2017-10-05 18:08:00 · 313 阅读 · 0 评论 -
[bzoj1087]: [SCOI2005]互不侵犯King(状压dp)
传送门 状压dp O(2n)O(2^n)预处理出来一行的合法状态,然后构造dp转移方程: fi,j,k表示第i行,此行状态为j,填了k个king时的方案数f_{i,j,k}表示第i行,此行状态为j,填了k个king时的方案数 则转移方程为:fi,j,k=∑fi−1,s,k−cnt(j)(j,s∈合法状态集合)f_{i,j,k}=\sum f_{i-1,s,k-cnt(j)}\big(j,s\原创 2017-09-30 12:24:47 · 238 阅读 · 0 评论 -
洛谷 P2014 选课
传送门 很久以前就写了,然而一直没发博客,现在讲课的时候老师课件里有,我就发上来,这个题还是很好的。 加一个根,将所有树的根都连过去,然后多叉转二叉,树形dp即可。 代码:#include<bits/stdc++.h>#define ll long longusing namespace std;int n,m;int v[301];int fa[301];int ls[301];原创 2017-10-04 15:24:33 · 329 阅读 · 0 评论 -
清北学堂-D4-T1-beautiful
这个题可以枚举中位数,然后比它小的数当做-1,比它大的数当做1,然后问题就转化成了找一段最长的和为0的子段,可以线性求前缀和,记录每个值的最大出现位置,然后可以线性得答案。 至于查询,就搞个st表就好了。 代码:#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#in原创 2017-10-04 14:25:51 · 1019 阅读 · 0 评论 -
清北学堂-D3-T3-shoot
开个坑放着。。。原创 2017-10-04 14:18:03 · 312 阅读 · 0 评论 -
【NOIP2017提高A组冲刺11.2】救赎(数学期望)
Description“是的。”我回答,“我不会忘记你。在森林里我会一点点记起往日的世界。要记起的大概很多很多:各种人、各种场所、各种光、各种歌曲……” ——村上春树《世界尽头与冷酷仙境》在没有心存在的世界尽头,音乐能够使小镇居民消散的心重新聚拢成形。作为镇子里唯一一个还残留着些许音乐记忆的人,我逐渐记起了往昔点滴……记忆中有一棵无根树,有n个节点。 对于一棵有根树的每一个非叶子节点,我们都等概原创 2017-11-02 13:35:44 · 448 阅读 · 0 评论 -
【NOIP2017提高A组集训10.25】凤凰院凶真(dp)
DescriptionInputOutputSample Input5 1 4 2 5 1 4 1 1 2 4Sample Output2 1 4Data Constraint题解这题我考场上想到了各种玄学复杂度的方法,然后没写一种,直接调T2去了 T2也没调出来,结果是我T2树状数组出了一个诡异的问题,然后100->0。。。 这个题其实就是个dp dp[i][j]代表a数组到i,b数原创 2017-10-25 15:44:42 · 374 阅读 · 0 评论 -
【NOIP2017提高A组集训10.25】摘Galo (树形dp)
Description0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO。 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Galo,美味度为w[i]。 OvO发现,如果她摘下了i号Galo,那么i的子树中的Galo以及i到根的路径上的其他Galo都会死掉。 OvO的袋子只能装k个Galo,她的嘴巴里还能叼1个,请问她所摘Ga原创 2017-10-26 13:21:58 · 864 阅读 · 0 评论 -
BZOJ3456:城市规划
我中间有一步没开LongLong,然后快速幂的时候就GG了 大概就是: f(n)代表n个点的无向连通图数目g(n)代表n个点的无向图数目g(n)=2n(n−1)2考虑枚举1个点所在连通块的点的个数g(n)=∑i=1nC(n−1,i−1)∗f(i)∗g(n−i)这东西是不是长得很像卷积(明明是1004535809像卷积)然后我们把组合数拆开之后:g(n)=∑i=1n(n−1)!f(i)g(n−i...原创 2018-03-15 21:32:34 · 298 阅读 · 0 评论 -
BZOJ3992:[SDOI2015]序列统计
传送门 这个题大概裸dp这样:dp(i,j)代表已经填了前i个位置,当前乘积为j的方案数C(k)代表集合S中是否存在kdp(i+1,j∗k%m)=∑kdp(i,j)∗C(k)然后这个dp是O(m2n)的,也没啥优化的办法我们尝试将∗转化成+原根是个不错的选择原根可以将m−1个不同的数字(这个题目里0可以不计)对应到m−1个不同的幂上所以我们对应了之后,dp方程就改变了:dp(i+1,(j+k)%...原创 2018-03-14 20:56:12 · 325 阅读 · 0 评论 -
[WC2008]:游览计划
这题劲爆呀 斯坦纳树(的裸题)真是easy easy到我调这道题只用了2.5h呢 大概就是dp[i][s]表示当前在i当前选点集合为s的最小代价 然后列dp转移方程就好辣: dpi,S=minT∈S{dpi,T+dpi,S−T}dpi,S=minT∈S{dpi,T+dpi,S−T}dp_{i,S}=min_{T\in S}\{dp_{i,T}+dp_{i,S-T}\} dpi,S=mi...原创 2018-03-06 22:00:02 · 347 阅读 · 0 评论 -
1-1 T1 tree(dp+组合数学)
题目描述有 n 个点,第 i 个点的限制为度数不能超过 ai。 现在对于每一个 s(1问从这 n 个点中选出 s 个点组成有标号无根树的方案数。 答案对1004535809取模。输入输出格式输入格式:第一行一个整数表示n。 第二行n个整数a1~an。输出格式:一个n个整数,第i个整数表示s=i时的答案。输入输出样例输入样例#1: 复制 3 2原创 2018-01-18 12:05:31 · 533 阅读 · 0 评论 -
[51Nod 1326]:遥远的旅途
传送门 这个题的思路就是个dp,不过是在模意义下的dp 我们来设计一个dp[i][j],代表在i这个点,当前路径长度%mod==j,的最小路径长度 我们枚举终点周围的每一条边x,然后mod=2*x,跑spfa,看dp[n][T%mod]是否被访问过 关于证明可以采用反证法。 这个题细节挺多的 代码:#include<cstdio>#include<cstring>#include<i原创 2017-12-06 15:04:46 · 320 阅读 · 0 评论 -
[bzoj1019]:[SHOI2008]汉诺塔
传送门 我只能说,乍一看题解好简单,结果看了一个多小时。。 就是f[x][i]代表从x到g[x][i]的最小步数 然后dp 具体的我不会讲 可以看这个,这个有图: http://blog.163.com/suicidal_tomato/blog/static/2344980402014918104434888/ 代码:#include<cstdio>#include<cstring>原创 2017-12-03 17:15:34 · 356 阅读 · 0 评论 -
[bzoj1010]:[HNOI2008]玩具装箱toy
传送门 这个题貌似有三种做法。。 首先可以斜率优化dp 然后可以证(da)明(biao)发现决策单调性 之后根据这个结论有两个做法: 1.每次算出来一个dp[i],就往后二分查找影响区间的变化点x,然后将[x,n]涂上i 然后按照这样递推算出来就好了,涂色用线段树,O(nlog2n)O(nlog^2n) 2.用单调队列和二分查找,具体可以看hzwer的code 参(chao)考(xi原创 2017-11-23 11:48:57 · 253 阅读 · 0 评论 -
[bzoj1017]:[JSOI2008]魔兽地图DotR
传送门 这个题简直了,我整个代码都是抄的,抄完还是一脸懵逼 我就tm没见过这么难的树形dp 一开始还以为水题,然后发现根本不知道怎么dp 题解还是直接抄hzwer的吧。。 设P[x],L[x],M[x],表示物品x的能量,购买上限与价格 L[x]=min(L[x],m/M[x]) 高级装备的M和L随便dp一下 再用f[i][j][k]表示第i个物品,有j件用于上层的合成原创 2017-11-28 17:48:45 · 431 阅读 · 0 评论 -
清北学堂-D3-T2-safe
这个题有一个很明显的O(n4)O(n^4)的暴力dp方程,我们考虑优化这个dp: fi=max(sumi−sumj+sumk−suml)(j<=i,k<=j,l<=k)f_i=max(sum_i-sum_j+sum_k-sum_l)(j<=i,k<=j,l<=k) 后两个sumk−sumlsum_k-sum_l的值可以通过经典的最大子段和的dp做出来,记为mxjmx_j 然后就是这样了: f原创 2017-10-04 14:14:26 · 513 阅读 · 0 评论 -
清北学堂-D3-T1-tree
这个题很水,很明显树形dp。 dfs处理出来子树大小size, 然后dp出来向下的深度和down, 然后再dp向上的深度和up, 然后遍历一遍取max就好了。 代码:#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#defi原创 2017-10-04 13:57:53 · 1964 阅读 · 0 评论 -
清北学堂-D2-T3-plutotree
此题我爆零,不想改了。 解法:树形dp(dfs),倍增lca,分类乱搞。。 贴个std:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 111111;const int inf = 1原创 2017-10-02 18:39:39 · 704 阅读 · 0 评论 -
关于特殊的LCS问题的优化
首先是一道比较简单的例题:传送门 题目的提示很明显,元素无重复,然后看看样例,手玩一下,就会发现选的元素在上面对应着上升的位置,而且这还是两个排列,那么就可以建立一个从排列A到排列B的映射,然后就可以转化成为LIS问题了,这个问题是有O(nlogn)的解法的。 代码:#include<cstdio>using namespace std;int n;int a[100001];int b原创 2017-09-16 14:41:15 · 595 阅读 · 0 评论 -
图论--tarjan缩点
模板:洛谷P3387 关于tarjan大神的算法我也只能抄抄代码了(滑稽) 其实《算法竞赛入门经典:训练指南》里有讲解,很详细。 代码:#include<bits/stdc++.h>#define ll long longusing namespace std;vector<int> G[10001];int n,m;int dfn_clock;int v[10001];int原创 2017-08-28 20:40:58 · 2133 阅读 · 0 评论 -
洛谷 P2359 三素数数
日常水一篇(滑稽)题目描述如果一个数的所有连续三位数字都是大于100的素数,则该数称为三素数数。比如113797是一个6位的三素数数。输入输出格式输入格式: 一个整数n(3 ≤ n ≤ 10000),表示三素数数的位数。输出格式: 一个整数,表示n位三素数的个数m,要求输出m除以10^9 + 9的余数。输入输出样例输入样例#1: 4 输出样例#1: 204题解这题明显dp。 预处理素数表原创 2017-08-23 20:33:12 · 695 阅读 · 0 评论 -
洛谷 P1807 最长路_NOI导刊2010提高(07)
题目描述设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j。设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径。输入输出格式输入格式: 输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v)。输出格式: 输出文件longest.out,一原创 2017-08-20 12:25:24 · 409 阅读 · 1 评论 -
洛谷 P2422 良好的感觉
题目描述kkk做了一个人体感觉分析器。每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适。在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感受值 * [i, j]中每一天感受值的和。现在给出kkk在连续N天中的感受值,请问,在哪一段时间,kkk感觉最舒适?输入输出格式输入格式: 第一行为N,代表数据记录的天数第二行N个整数,代表每一天的感受值输出格式: 一行,表原创 2017-07-06 09:56:32 · 632 阅读 · 0 评论 -
洛谷P1005 矩阵取数游戏
题目描述帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;2.每次取走的各个元素只能是该元素所在行的行首或行尾;3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号);4.游戏结束总得分为m次取原创 2017-07-12 08:07:03 · 666 阅读 · 0 评论 -
洛谷P2285 [HNOI2004]打鼹鼠
题目描述鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的。根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气。你可以控制一个机器人来打鼹鼠,如果i时刻鼹鼠在某个网格中出现,而机器人也处于同一网格的话,那么这个鼹鼠就会被机器人打死。而机器人每一时刻只能够移动一格或停留在原地不动。机器人的移动是指从当前所处的网格移向原创 2017-07-12 07:52:53 · 304 阅读 · 0 评论 -
洛谷P1171 售货员的难题
题目描述某乡有n个村庄(1< n <20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0< s <1000)是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。 输入输出格式 输入格式:村庄数n和各村之间的路程(均是整数)。输出原创 2017-07-11 20:57:09 · 514 阅读 · 0 评论 -
洛谷 P3211 [HNOI2011]XOR和路径(推dp+高斯消元)
传送门 首先,异或的话直接讨论不好讨论,那么我们可以按位讨论,对于每一位讨论出来一个结果,然后将结果相加就好了。 然后考虑怎么讨论一位上的结果。 我们可以设出来一个dp方程:f(i)f(i)表示i到n的异或和期望值,则初始状态为f(n)=0f(n)=0 dp转移方程就是:其中weight(u,v)weight(u,v)代表(u,v)(u,v)的那一位的值 f(v)=∑(u,v)∈Ef(u)原创 2017-09-19 11:19:34 · 612 阅读 · 0 评论 -
洛谷 P1776 宝物筛选_NOI导刊2010提高(02)
传送门 这题是多重背包的二进制分解+01背包处理。 给个图: 我就不多说了,自己看吧。 代码:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#include<vector>#include<queue>#define原创 2017-09-11 15:56:19 · 493 阅读 · 0 评论 -
[bzoj1212] [HNOI2004]L语言(trie+dp)
传送门 我们可以建一个trie树,然后dp 状态:f(x)表示1f(x)表示1~x能否被拼出来x能否被拼出来 然后我们就可以在trie树上暴力地边走边判断,当f(x)=1f(x)=1时用它来推其他状态。 边界:f(0)=1f(0)=1 代码:#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#incl原创 2017-10-06 20:52:32 · 359 阅读 · 0 评论 -
清北学堂-D2-T2-chance
首先,我们一定要求出每个[l,r]内的满足条件的数的个数,方法也很简单,一位一位算就好了,具体可以看我的代码。 然后就可以求出在每一个袋子里抓球是否是1的概率了。 然后考虑如何求题目中的问题。 然后发现那个k%其实就是n*k/100,这个值不会超过n。 然后就可以很容易的设计出一种状态来进行dp, 设f(i,j)代表前i个袋子中有j个是1的概率设f(i,j)代表前i个袋子中有j个是1的概率原创 2017-10-02 15:09:18 · 636 阅读 · 0 评论 -
清北学堂-D1-T3-roadwork
这个题可以容易想出O(n2∗a)O(n^2*a)的dp方程和状态,但是时间空间都不够。 dp:f(i,j,k)−>左i,右j,时间k,的最小发怒人数f(i,j,k)->左i,右j,时间k,的最小发怒人数 然后做法十分神奇,我真的学到了。 我们这时可以将状态和值互换,将时间和发怒人数互换,就是这样: dp:f(i,j,k,0/1)−>左i,右j,发怒人数k,0当前左/1当前右,的时间f(i,j原创 2017-10-02 00:30:10 · 496 阅读 · 0 评论 -
2014-3-15-不等数列num(dp)
Problem 2 不等数列(num.cpp/c/pas) 【题目描述】 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。问在所有排列中,有多少个排列恰好有k个“<”。答案对2012取模。【输入格式】 第一行2个整数n,k。【输出格式】 一个整数表示答案。【样例输入】 5 2 【样例输出】 66 【数据范围】 对于30%的数据:n <= 10 对于原创 2017-10-18 18:33:33 · 257 阅读 · 0 评论 -
[bzoj1026][SCOI2009]windy数(前缀和+数位dp)
传送门 (明明这么一个水题,我居然被坑了这么久) 数位dp。 首先前缀和,答案就是solve(b)-solve(a-1),然后预处理dp,每次统计答案。 可以看这篇blog 代码:/************************************************************** Problem: 1026 User: stone41123原创 2017-09-30 12:22:55 · 261 阅读 · 0 评论 -
洛谷 P1714 切蛋糕(dp+RMQ)
传送门 首先,很简单的dp方程: fi=max(si−sj)(j∈[i−m,i])f_i=max(s_i-s_j)(j\in [i-m,i])然后发现sis_i与jj无关,可以提出来: fi=si−min(sj)(j∈[i−m,i])f_i=s_i-min(s_j)(j\in [i-m,i])发现这个方程可以用数据结构优化,比如线段树,树状数组等等,我这里推荐用st表。 预处理:O(nlog原创 2017-09-30 12:22:17 · 663 阅读 · 0 评论 -
[hdu3507] Print Article(斜率优化dp)
传送门 今天的斜率优化dp第二题,被自己坑了好长时间 一开始dp方程都错了,还过了样例。。。 正题,斜率方程其实很好推,就是细节比较坑,其它没什么难的,我不说思路了。 slope(j,k)=fj−fk+s2j−s2ksj−skslope(j,k)=\frac {f_j-f_k+s_j^2-s_k^2} {s_j-s_k} 代码:#include<bits/stdc++.h>#define原创 2017-09-30 12:21:35 · 251 阅读 · 0 评论