
DP
文章平均质量分 67
Miao_zc
膜Hz
展开
-
bzoj2326: [HNOI2011]数学作业
一开始一直不理解矩阵乘法是什么东西。。。现在有一点自己的想法。对于如f(i+1)=a*f(i)+b,可以构造一个矩阵b,使矩阵a[i]*矩阵b=矩阵a[i+1]。然后利用矩阵快速幂加速。这道题对于不同的位数有不同的递推式。设位数为k,f[i+1]=10^k*f[i]+i+1,可构造3*3的矩阵:10^k,1,1 0,1,1 0,0,1(好像不太对。。。)。#include原创 2016-03-14 11:17:44 · 456 阅读 · 0 评论 -
uoj275. 【清华集训2016】组合数问题
智力孤危。。这道题可以根据lucas定理,把C(n,m)是k的倍数转换为n,m的k进制数,某一位的组合数是k的倍数,也就是n,m在k进制表示下n有一位比k小(大)。这样子的话就转换为一个数位DP,就能做了。题解貌似就把lucas推了一遍,嗯,差不多#include#include#define ll long long#define P 1000000007#define I2原创 2017-02-21 20:40:44 · 1486 阅读 · 0 评论 -
bzoj4379: [POI2015]Modernizacja autostrady
好长啊题目。。。大概就是把一棵树分成两棵再拼成一棵后的最大最小直径。应该可以想到树形DP,保存每个节点为根的子树的直径和出去该子树后的直径。为此我们需要维护每个节点向下的前三长的链(每个儿子只记一次),向上最长的链,儿子中前二长的直径,然后可以求出在哪里断开。最后把两棵树的直径找粗来,并起来即可。说起来好像很简单,然而我做了一周。。真是太弱了。。。代码比较丑2333#inclu原创 2016-06-21 15:42:49 · 847 阅读 · 0 评论 -
bzoj1195: [HNOI2006]最短母串
一开始以为这是字符串好题,一看n范围,n!就炸了。考虑dp,dp[i][j] i表示每个子串有没有出现,j表示最后的串。看了lych的博客之后,自己还是naive!首先有可能出现一个串没有用,要预处理掉,另外字典序最小需要存更多的东西。复杂度O(2^n*n*n*跑得过)。#include#include#include#define N 13using namespace s原创 2016-12-07 15:31:11 · 702 阅读 · 0 评论 -
bzoj4574: [Zjoi2016]线段树
好久没写题解了。。。这道题拖了好久,终于把常数卡进去了。首先发现数据随机,肯定不是正常算法,不妨离散。考虑DP,用dp[q][i][j]k]表示q轮后i~j最后变成k的情况。比较难转移。参考大神的blog:用dp[q][i][j][k]表示表示q轮后i~j最后变成每个数都小于等于k的情况,这样可以转移。//不要问我怎么转,好久以前推得式子然后每个值k只影响一段i~j的dp值原创 2016-10-10 21:00:33 · 721 阅读 · 0 评论 -
bzoj4035: [HAOI2015]T3
发现翻转相当于增加一个白格对于一个白格子,它的SG值只与它还能跳的次数有关,如长度10,SG[4]=SG[5]。于是不同的状态只有sqrt(n)个。只要求出还能跳k步的位置的SG就能得到答案。暴力DP即可,貌似O(n)能过#include#include#include#include#define N 100005using namespace std;int n,k,s原创 2016-08-03 21:07:30 · 1056 阅读 · 0 评论 -
bzoj4381: [POI2015]Odwiedziny
点这里→这道题暴力跑最多n/m个点(m为步长),当m较小时飞慢。考虑DP[i][j]表示从i以j步长跳到根的和,询问可达到O(1+lca)。这样对m>sqrt(n)的暴力,另外up函数是利用树剖把x往上跳y下,同一个方向跳复杂度O(logn)。#include#include#include#define N 50005using namespace std;int n,原创 2016-07-03 10:49:59 · 897 阅读 · 0 评论 -
bzoj3573: [Hnoi2014]米特运输
看懂了题目就A了一半。。。大意是这样的,给一棵以1为根的树,求最少修改几个点的容量后,使得除根节点外所有节点为父亲容量/父亲的儿子个数。因为1个节点确定,所有节点都确定了,不妨对每个点求出它不修改时根节点的容量,Hash一下就可以了。(貌似自然溢出会WA,可能我写炸了吧)#include#include#include#define ll long long#define N原创 2016-05-17 07:33:29 · 719 阅读 · 0 评论 -
bzoj3572: [Hnoi2014]世界树
这道题是叫做虚树的东西,可以发现每次的关键点个数较少,每次用O(n)的DP显然TLE。可以将所有关键点及关键点lca间连上虚边,对这O(m)个点DP,链上的点可以分成两段,分别计算贡献即可,细节蛮多,树链剖分比倍增快。#include#include#include#include#define N 300005#define inf 1000000000using namespa原创 2016-05-16 19:25:24 · 527 阅读 · 0 评论 -
bzoj3462: DZY Loves Math II
第一眼看题没看懂。。后来发现pi可以等于pi+1。。。题目可化为给定S=p1+p2+...+pk,求p1*x1+p2*x2+..+pk*xk=n的方案数(x1,x2,x3,...>0)。因为S不妨把xi分为ai=xi/S,bi=xi%S。枚举m,p1*b1+p2*b2+...+pk*bk=n-m*S。这个可以用多重背包的方式预处理,剩下的可用插板法得到,时间复杂度O(sqrt(S)+S原创 2016-05-23 08:16:28 · 1615 阅读 · 0 评论 -
bzoj4584: [Apio2016]赛艇
根据题意可想到离散化后dp:dp[i][j][k]表示前i个数在区间j内放k个的方案数,开滚动复杂度O(n^3)。然而被bzoj卡常。。。(约1.8s)优化之后变得更慢了。。看了AC代码,发现可以换种思路:#include#include#include#include#define N 505#define ll long long#define MO 1000000007原创 2016-05-13 18:28:01 · 1430 阅读 · 0 评论 -
bzoj2958: 序列染色
一眼想到是DP,然而不会。用DP[i][j][k]表示第i位为k,状态为j的方案数,O(1)转移即可。Orz lych#include#include#define N 1000005#define P 1000000007using namespace std;int n,k,dp[N][3][2],W[N],B[N],t;char c[N];int Mo(int x,int原创 2016-05-26 15:52:43 · 857 阅读 · 0 评论 -
bzoj4318: OSU!
期望DP#include#includeusing namespace std;int n;double x,a,b,c;int main(){ scanf("%d",&n); while (--n) { scanf("%lf",&x); c+=((a+b)*3+1)*x; b=(b+a*2+1)*x; a=(a+1)*x; } printf("%.1f\原创 2016-04-18 09:32:12 · 466 阅读 · 0 评论 -
bzoj1187: [HNOI2007]神奇游乐园
这是一道插头DP。。。不会的可以看一下《基于连通性状态压缩的动态规划问题》ppt然后就是裸题了?预处理出所有合法的状态,以及每种状态的每个插头匹配的位置,DP时间复杂度O(2^m*n*m)。分9种情况写的也是乱的。。#include#include#include#define inf 1e9using namespace std;int n,m,a,tot,dp[2][原创 2016-04-14 10:30:58 · 772 阅读 · 0 评论 -
bzoj3875: [Ahoi2014]骑士游戏
一看这题,不是记忆化吗!?再看,有环很么办。。。SPFA!用SPFA动规,一开始用dp[i]存当前DP的状态,a[i]存答案。用dp[i]更新杀死后会出现i的点,更新完之后存入a[i]。a[i]与dp[i]的差就是更新减少的体力值。感觉没说清楚。。。#include #include#define N 300005#define S 10000005#define in原创 2016-03-10 07:01:36 · 774 阅读 · 0 评论 -
bzoj2152: 聪聪可可
这题显然点分治DP?我不会告诉你我还不会点分治)先O(n)求Dfs序,然后倒序dp[i][j]表示i及i的子树中的点到i距离%3为j的方案数。最后对每个点,O(1)计算经过它的路径为3的倍数的方案数,得到Ans。求Ans与n*n的Gcd,约分即可。//一开始写的有点乱,只好各种*2+n 。。。#include #include#define N 80000using name原创 2016-03-19 16:44:10 · 487 阅读 · 0 评论 -
bzoj4767: 两双手
注意一个条件,ax*by!=bx*ay,所以每个点所需的每只手的次数是固定的,于是就可以转换为网格图(注意这里|坐标|注意有一些无解的可能需要特判。//发现bzoj上使用cerr会返回RE 2333#include#include#include#define P 1000000007#define ll long longusing namespace std;int Ex,原创 2017-03-11 08:59:59 · 966 阅读 · 1 评论