动态规划
HbFS-
di4CoveRy
展开
-
[BZOJ1419]Red is good 数学期望动态规划
诶自从经历了今年的联赛已经不是特别怕数学期望dp了F[i][j]表示剩i个红球,j个黑球时候的期望收入F[i][j] = i/(i+j) * F[i-1][j] + j/(i+j) * F[i][j-1]爆空间把一维滚掉就行了#include #include #include #define N 5050using namespace std;typedef原创 2016-12-17 18:01:49 · 357 阅读 · 0 评论 -
[BZOJ4872][Shoi2017]分手是祝愿 数学期望
先看N=k的,考虑一下怎么用最少步数解决这个问题。 一个做法是从高位到低位,没遇到一个开着的灯就将它关闭,易证这样的策略是最优的,而且是唯一的。 问题转化为目前有n个开关,其中有t个开关需要被按奇数次,求期望步数。F[t]表示由剩t个开关到剩t-1个开关所需要的期望步数。 Ft=tn+n−tn(1+Ft+1+Ft)F_t=\frac{t}{n}+\frac{n-t}{n}(1+F_{t+1}+原创 2017-05-29 22:23:29 · 932 阅读 · 0 评论 -
JSOI2017 Day1T3 code解题报告
JSOI2017 Day1T3 code解题报告 via. HbFS-观察语法规则可以发现 1、每个循环结束后寄存器的值是0 2、若当前寄存器值为0,则在后面添加一个循环,在循环内部添加任意能通过编译的程序,新程序都不会死循环我们可以用动态规划求解这个问题hih_i表示长度为ii能通过编译的程序数量fi,jf_{i,j}表示长度为ii,寄存器初始值为0,运行结束寄存器值为xx的程序数量 若j原创 2017-04-20 21:26:32 · 1607 阅读 · 4 评论 -
[BZOJ1055][HAOI2008]玩具取名 记忆化搜索
Fl,r,tF_{l,r,t}表示[l,r]区间的字符串是否能够用字符t代替 转移不是特别复杂,不过我还是拿记忆化搜索来写了 O(N3)O(N^3)状态,每个状态O(N)O(N)转移,总时间代价O(N4)O(N^4)#include <bits/stdc++.h>#define N 305using namespace std;int g[5][5][5];int dp[N][N][5],原创 2017-05-24 20:26:14 · 489 阅读 · 0 评论 -
[BZOJ4861][Beijing2017]魔法咒语 AC自动机+动态规划+矩阵快速幂
对忌讳词语构建AC自动机 Fi,jF_{i,j}表示长度为ii,匹配到AC自动机第jj位的合法串方案数 当状态数少的时候用矩阵转移#include <bits/stdc++.h>#define N 5050const int mod = 1e9+7;using namespace std;typedef long long LL;int len[105],cnt,n,m,l,ans;原创 2017-04-23 09:26:34 · 1047 阅读 · 0 评论 -
[BZOJ1048][HAOI2007]分割矩阵 记忆化搜索
观察均方差公式 若将一个区域的代价定于为(该区域的和−平均数)2(该区域的和-平均数)^2,答案为代价的和n−−−−−√\sqrt \frac{代价的和}{n} 动态规划Fx1,y1,x2,y2,tF_{x_1,y_1,x_2,y_2,t}表示图上一个矩形,对这个矩形分割tt次得到的代价 当t=1时Fx1,y1,x2,y2,1=(sum−ave)2F_{x_1,y_1,x_2,y_2,1}=(原创 2017-05-23 20:06:25 · 389 阅读 · 0 评论 -
[AtCoder2045]Salvage Robots 动态规划
四维动态规划F[a][b][c][d]画一个包含出口的矩形,用来表示哪里已经被访问过了,顺带能表示那些机器人已经被续了 主动递推往四个方向加一行/一列,把活着的机器人统计了就好#include <bits/stdc++.h>#define N 101unsigned short F[N][N][N][N],mp[N][N],sum[N][N];using namespace std;inl原创 2017-03-13 22:08:34 · 503 阅读 · 1 评论 -
Ural 1519 Formula 1 基于连通性的状态压缩动态规划
2kb代码#include <bits/stdc++.h>#define mask 600000#define N 15#define Hash 1999987#define mc(p) memset(p,0,sizeof(p))using namespace std;typedef long long LL;int a[N][N],e[Hash+1],hash[Hash+1];int原创 2017-02-24 11:30:12 · 362 阅读 · 0 评论 -
[GDKOI2016] Day2 QT与泰剧 数位dp
诶终于到博客第100篇了,值得纪念啊数位dp有很多种写法,大部分是记忆化搜索或者多一维表示是否受限制,我之前的写法一直是一遍普通dp+一遍普通搜索,虽然很好理解但是写起来很挫,这次尝试了一下多一维的做法(实际上我开了两个数组)F[i][p1][p2]F[i][p1][p2]表示第ii位(以个位为第一位),p1表示是否全部为质数,p2表示模3的余数。 特别注意处理前导零(我真是菜鸟在这里处理了好久,原创 2017-01-29 14:13:56 · 337 阅读 · 0 评论 -
[BZOJ1564][NOI2009]二叉查找树 动态规划
这玩意儿就是一个Treap对吧 因为key值可以选择任意实数,所以修改之后的key值 F[l][r][w]F[l][r][w]表示构建l到r的Treap并且根节点的key值为w所需要的最小代价 O(n3)O(n^3)状态,O(n)O(n)转移,总时间O(n4)O(n^4)/*************************************************************原创 2017-02-12 13:33:22 · 413 阅读 · 0 评论 -
[BZOJ4416][Shoi2013]阶乘字符串 状态压缩dp
诶一直感觉这个数字特别大的时候会无解 然而一直没有把这个数算出来,觉得可能是大于一个数无解小于一个数暴力 然而看题解发现这个数字是2121正解先特判nn是否大于2121,若大于puts no 否则进行状态压缩dp,F[mask]F[mask]表示最短的前缀,能满足以mask为字符集合的阶乘字符串 若F[mask]<=mF[mask] <= m有解否则无解/******************原创 2017-02-12 13:12:42 · 473 阅读 · 0 评论 -
[UOJ241]【UR #16】破坏发射台 矩阵快速幂
若环的长度为奇数,也就是没有正对着的点,那么我们可以用类似dp的方法F[i][j]表示第i位颜色为j的方案数很容易可以推出公式 ans = (m-1) ^ n - (m-1)至于环的长度为偶数,要考虑正对着点考虑将环从长度一半处切下来,和剩下一半拼成一条宽度为2的环每个点不能和它相邻的点相同用F[i][j][k]表示第i位,上面颜色为j,下面颜色为k的方案数原创 2017-01-16 19:40:33 · 469 阅读 · 0 评论 -
[BZOJ1023]静态仙人掌 Tarjan+dp+单调队列
诶写完写完代码以后才发现天黑了,赶快溜出去找东西吃求仙人掌的直径,不能直接两边DFS找最长路,有这样一个反例绿色为真实的直径,可是如果第一遍找到最长路是红色路径的话,那么就找不到绿色路径还是用最传统的方法,dp求从该节点出发的最长连引用一篇写的虽然有点长但是写的很好的博客http://z55250825.blog.163.com/blog/static/1502原创 2017-01-16 19:25:54 · 482 阅读 · 0 评论 -
[多校][HDU5343]MZL's Circle Zhou后缀自动机+动态规划
对两个字符串都构建后缀自动机对第一个字符串,求F[i]表示从rt到i节点有多少不同的路径(即求不同的子串的个数);对第二个字符串,求G[i]表示从节点i开始往下走能走出多少不同的路径(即求不同的子串的个数);这两个动态规划都可以用拓扑排序和ch[][]数组转移完成,第二个dp可能需要将ch[][]里面的每一条边反向。枚举第一个后缀自动机里的节点u,若该节点的出边j不存在,则原创 2017-01-09 20:33:22 · 360 阅读 · 0 评论 -
[UVALive]7344 数位dp+状态压缩dp
诶写了几天终于写过去了 看了网上无数的模板,发现都不好用,最后还是用了自己的办法写出来 细节多而且复杂状态压缩DP,F[mask]表示mask状态下的答案方案数,G[mask]表示取一个状态为mask的数的方案数 F[S]=∑(G[p]∗F[S异或p]) F[S] = \sum (G[p] * F[S异或p]) 其中p包含了lowbit(S)至于G[]数组怎么求,那就是另外一个数位DP了原创 2016-12-12 20:25:14 · 569 阅读 · 2 评论 -
[Codeforces Gym]100162 H - Temperature 状态压缩dp
G[mask]是一个二进制状态,表示严格取mask这些人的实验结果算平均值的时候,有多少人的答案会被覆盖。F[mask] = G[mask] or F[S1] or F[S2] or F[S3] ... or F[Sn],其中Si为mask的子集这是$ 3^n $转移,显然会超时可以把它优化成,F[mask] = G[mask] or F[P1] or F[P2] ... F[Pn],原创 2016-12-17 10:02:26 · 368 阅读 · 0 评论 -
[UOJ#185][ZJOI2016] 小星星
将树镶嵌在图里面,等价于用树去覆盖这个图,每个点都被覆盖一次。 每个点都被覆盖一次,等价于,每个点至少被覆盖一次方案数=所有点都可以覆盖-至少有1个点未被覆盖+至少有2个点未被覆盖-至少有3个点未被覆盖……(这里的图上的点可以被树上的点重复覆盖) 求某些点不能被覆盖的方案数,可以用树上dp完成,Fi,jF_{i,j}表示树上第ii个点对应图上第jj个点,该子树的方案数 爆枚图上有哪些点一定不能原创 2017-06-15 19:52:57 · 487 阅读 · 0 评论