![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
文章平均质量分 77
蜗角虚名羊
这个作者很懒,什么都没留下…
展开
-
绍兴一中模拟赛3.19——白驹过隙
Description定义类仙人掌为:求类仙人掌上的最大独立集大小,(n<=50000,m<=100000)(n<=50000,m<=100000)(n<=50000,m<=100000)SolutionCode注意f[p2][p1][0][1]f[p2][p1][0][1]f[p2][p1][0][1]等于f[p...原创 2019-03-21 18:09:45 · 237 阅读 · 0 评论 -
bzoj1019: [SHOI2008]汉诺塔
题目 题解 因为转移的优先顺序,所以到达每一个目标的转移过程是一定的。 考虑dp方程: f[x][i]表示第x个柱子上有i个盘子,把他们都移动到g[x][i]这个柱子上要花得步数。 首先考虑i=1,因为操作有优先顺序,因此g[x][1]可以确定,f[x][1]都是1。 接下来考虑任意的i,那么我们需要把i-1个移动到g[x][i-1]上面去,再把剩下的一个移动到(1+2+3-x-g[x...转载 2018-06-15 15:08:20 · 104 阅读 · 0 评论 -
bzoj1037: [ZJOI2008]生日聚会Party
题目 题解 用f[i][j][x][y]表示到第i个人,总共j个男生,以i结尾的任意长度中男生最多比女生多x,女生最多比男生多y的方案数。 状态转移如下: 如果x+1&lt;=k,f[i+1,j+1,x+1,max(y-1,0)]+=f[i][j][x][y] 如果y+1&lt;=k,f[i+1,j,max(x-1,0),y+1]+=f[i][j][x][y] 最...转载 2018-06-19 21:08:40 · 116 阅读 · 0 评论 -
bzoj2553: [BeiJing2011]禁忌(AC自动机)
题目参考的题解Solutionf[i][j]表示前i个字符,在trie树上j的位置的期望对于u及其儿子v,若v是危险节点,那么u到0连边,否则u到v连边因为统计的是0到n的所有不同长度的期望值之和,所以还要加个虚拟节点,记录答案Code#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;typedef long double ld;...原创 2018-12-20 09:04:55 · 150 阅读 · 0 评论 -
51nod 1241 特殊的排序
题目Solution求d=1的最长等差子序列Code#include<bits/stdc++.h>using namespace std;const int N=50002;int n,i,ans,f[N],a[N],x;inline char gc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&...原创 2018-11-01 11:06:54 · 161 阅读 · 0 评论 -
bzoj2287&洛谷P4141: 【POJ Challenge】消失之物(退背包)
ftiasch 有 $n$ 个物品, 体积分别是 $w_1,w_2,\dots,w_n$。由于她的疏忽,第 $i$ 个物品丢失了。 “要使用剩下的 $n-1$ 物品装满容积为 $x$ 的背包,有几种方法呢?”——这是经典的问题了。 她把答案记为 $\text{cnt}(i,x)$ ,想要得到所有$i \in [1,n]$, $x \in [1,m]$ 的 $\text{cnt}(i,x)$ 表格。原创 2018-11-01 08:35:41 · 256 阅读 · 0 评论 -
bzoj3174: [Tjoi2013]拯救小矮人
题目题解Solution考虑相邻的a和b若a.a+a.b<b.a+b.b则b应该在a之后逃跑大概这样理解就是如果只能通过一个,那么我无论怎么放都一样(后面是dp)如果可能通过俩,那么显然要把逃跑能力强的放在后面然后dp一下f[i]表示逃跑i个人后剩下的人梯最高的高度Code#include<bits/stdc++.h>using namespace std...转载 2018-11-01 08:15:15 · 180 阅读 · 0 评论 -
hdu5293 Tree chain problem
题目题解题意:有m条链,每条链链接两个顶点,链存在一个权值w,现在想要挑选一些链,挑选的链中不能出现相同的节点,问可以挑选出的最大的权重是多少Solution设dp[i]dp[i]dp[i]为以第iii个点位根节点的子树的最优解,sum[i]sum[i]sum[i]表示表示iii节点的所有子节点的dpdpdp和(注意:不包括iii)1.第iii个节点上不出现链,那么dp[i]=∑(dp[...转载 2018-10-29 09:07:12 · 287 阅读 · 0 评论 -
bzoj3997: [TJOI2015]组合数学
题目题解#Solution:将每一个财宝抽象成一个点,这就变成了一个有向无环图的最小路径覆盖,对于这类问题,我们知道最长反链=最小路径覆盖,所以求出这张图的最长反链就可以了。对于一个点,它的左上角是可以到达的,但是右上角不能,所以用f[i][j] 表示以i,j为左下角的矩形的最长反链,则f[i][j]=max(f[i][j+1],f[i-1][j],f[i-1][j+1]+a[i][j])#...转载 2018-09-22 16:08:00 · 192 阅读 · 0 评论 -
洛谷P3953 逛公园
题目题解:f[u][k] 表示 dis(u,n)&amp;amp;lt;=MinDis(u,n)+k的方案数,答案就是 f[1][K] f[u][k]=∑f[v][k−MinDis(v,n)+MinDis(u,n)-w] 这样怎么判 0环呢?只要在搜索的时候记录个 instack 就 ok 了 如果当前的 v还在搜索的栈中就可以直接返回 -1了 不过,有一种情况例外:0环所在的路径不符合条件 ...原创 2018-05-16 21:41:40 · 137 阅读 · 0 评论 -
Codeforces13C. Sequence
题目Solution1.dp变化后的每一个值肯定是等于原来序列的某个值(不会证)(a为原序列,b为排序后的序列),方程的意思是,把序列前i个数变为非递减序列并且以不超过b[j]的值结尾的最小花费,那么它要么是以不超过b[j-1]结尾的最小花费,或者是刚好以b[j]结尾的最小花费#include<bits/stdc++.h>using namespace std;int n...原创 2018-12-23 22:13:53 · 306 阅读 · 0 评论 -
bzoj2863: 愤怒的元首
题目Description求n个点的dag个数。Solution设fif_ifi为iii个点的dagdagdag个数。至少有iii个入度为000的点的方案为:fn−i(in)2i∗(n−i)f_{n−i}(^n_i)2^{i*(n−i)}fn−i(in)2i∗(n−i)容斥一下,则:fn=∑i=1n(−1)i−1fn−i(in)2i∗(n−i)f_n=\sum_{i=1}^{n}...原创 2020-01-18 10:57:19 · 264 阅读 · 0 评论 -
绍兴一中模拟赛3.21——孰是孰非
Description有一个长为n(n≤500)n(n≤500)n(n≤500)的序列,每次可以选一段区间加上xxx,如果有数大于777就减777(保持所有数∈[1,7]∈[1,7]∈[1,7])问:最少几次这样的操作才能使所有aia_iai都等于777Solutionstep1:step1:step1:先差分一下,令bi=ai−ai−1(1≤i≤n+1,a0=an+1=0)b_i=a_...原创 2019-03-21 14:15:18 · 162 阅读 · 0 评论 -
bzoj1835: [ZJOI2010]base 基站选址
题目题解Solution显然f[i][j]f[i][j]f[i][j]表示前iii个村子建了jjj个基站且第iii个村子建了基站f[i][j]=c[i]+minf[k][j−1]+cost(k,i)f[i][j]=c[i]+min{f[k][j-1]+cost(k,i)}f[i][j]=c[i]+minf[k][j−1]+cost(k,i)cost(k,i)cost(k,i)cost(k...转载 2019-02-26 10:03:46 · 165 阅读 · 0 评论 -
bzoj4543: [POI2014]Hotel加强版
题目题解#include&lt;bits/stdc++.h&gt;using namespace std;typedef long long ll;const int N=100002;struct node{ int to,ne;}e[N&lt;&lt;1];int n,i,x,y,tot,dep[N],h[N],son[N];ll space[N*7],*f[N],*g[N...转载 2019-02-25 16:01:53 · 214 阅读 · 0 评论 -
牛客网:msc的棋盘
题目题解Codes[i][j][k]=∑f[i][j][k]s[i][j][k]=\sum f[i][j][k]s[i][j][k]=∑f[i][j][k]#include<bits/stdc++.h>using namespace std;const int N=51,M=1e9+7;int f[N][N][N*N],s[N][N][N*N],a[N],b[N],c[N...转载 2019-02-27 20:32:30 · 162 阅读 · 0 评论 -
loj#2542. 「PKUWC2018」随机游走
题目题解Code#include&lt;cstdio&gt;const int M=998244353;struct node{ int to,ne;}e[38];int n,i,rt,x,y,h[18],S,tot,A[18],B[18],f[18][1&lt;&lt;18],d[18],q;inline char gc(){ static char buf[100000],...转载 2019-01-17 09:42:32 · 338 阅读 · 0 评论 -
loj#2540. 「PKUWC2018」随机算法
题目思路f[S]f[S]f[S]表示已经覆盖了SSS的状态的最大独立集大小g[S]g[S]g[S]表示此时的算法正确的方案数(最后除以n!n!n!就是期望了)设新加入的扩充最大独立集的点为iii,与i相连的点的状态为toito_itoi,那么g[S∣toi]=∑g[S]⋅An−∣S∣−1∣toi−S∣−1g[S|to_i]=\sum g[S]\cdot A^{|to_i-S|-1}_{...原创 2019-01-16 19:28:37 · 227 阅读 · 5 评论 -
loj#2538. 「PKUWC2018」Slay the Spire
题目参考自zhou888的代码Solution首先有一个很明显的贪心策略:强化牌选得越多越好,当然,要攻击牌打得出去才行当i&lt;ki&lt;ki<k时,强化牌打iii张,攻击牌打m−im-im−i张当i≥ki≥ki≥k时,强化牌打k−1k-1k−1张,攻击牌打m−k+1m-k+1m−k+1张两者结合,就是强化牌打min(i,k−1)min(i,k-1)min(...原创 2019-01-15 20:06:46 · 219 阅读 · 1 评论 -
loj#6433. 「PKUSC2018」最大前缀和
题目Solutionsumssum_ssums表示sss状态的所有数对应的和设fsf_sfs表示状态为sss的最大前缀和的方案数part1fs∣(1&lt;&lt;i)+=fs(sums&gt;0)f_{s|(1&lt;&lt;i)}+=f_s(sum_s&gt;0)fs∣(1<<i)+=fs(sums>0)考...原创 2019-01-20 21:29:54 · 324 阅读 · 0 评论 -
51nod 1406 与查询
Description有n个整数。输出他之中和x相与之后结果为x的有多少个。x从0到1,000,000Input第一行输入一个整数n。(1<=n<=1,000,000). 第二行有n个整数a[0],a[1],a[2],…a[n-1],以空格分开.(0<=a[i...转载 2018-08-13 21:37:29 · 243 阅读 · 0 评论 -
bzoj4762: 最小集合
题解1 题解2 其实差不多,随便选一篇看好了转载 2018-07-19 15:52:37 · 267 阅读 · 0 评论 -
单调队列
修剪草坪(mowlawn) 题目描述: 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N(1 &lt;= N &lt;= 100,000)只排成一排的奶牛,编号为1…N。每只奶牛的效率是不同的,奶牛i的效率为E_i(0 &lt;= E_i&...原创 2018-05-17 22:41:48 · 558 阅读 · 0 评论 -
bzoj1801: [Ahoi2009]chess 中国象棋
题目 某大佬的题解 以下内容改编自大佬的题解题解:dp[i][j][k]表示在前i行中有j列已经有2个,有k列已经有1个,那么0的个数就是m-j-k个 不放:直接加上dp[i-1][j][k] 放一个:1.把一列0变成1;2.把一列1变成2 放两个:1.把两列0变成1;2.把两列1变成2;3.把一列0变成1 再把另外一列1变成2 关于组合数: 放一个:直接乘要改变的数的个...原创 2018-04-25 00:39:26 · 166 阅读 · 0 评论 -
洛谷P1070 道路游戏
题目题解:f[i]表示到i的时间,小新所得到的金币数 状态转移方程:f[i]=max(f[i],f[i-k]-b[la]+sum)标程:#include<bits/stdc++.h>using namespace std;int n,m,p,ans=(int)-1e9,i,j,a[1003][1003],b[1003],pre[1003],la,sum,f...原创 2018-04-25 00:19:37 · 245 阅读 · 0 评论 -
bzoj1899: [ZJOI2004]Lunch 午餐
题目题解:有一个贪心策略:吃饭时间越长的越早打饭 然后动规,f[i][j]表示前i-1个数,第一个队列恰好要j的时间的最晚集合时间 可以降维,把i去掉 初始化:f[0]=0,其余为正无穷 第一个窗口打饭: f[j]=min(f[j],max(f[j-x],j+y)) (x<=j<=sum) =>f[j+x]=min(f[j+x],max(f[j],j...原创 2018-04-24 22:55:45 · 189 阅读 · 0 评论 -
bzoj1057: [ZJOI2007]棋盘制作
题目题解:step1:对于图上所有的棋盘一定属于以下两种类型: 1.黑格行列奇偶性相同,白格不同 2.白格行列奇偶性相同,黑格不同 在输入的时候属于第一种情况的赋1,属于第二种情况的赋0 问题就转化成统计最大的1或0矩形和正方形step2:正方形:g1[i][j]表示以(i,j)为右下角的全1正方形边长 g2[i][j]表示以(i,j)为右下角的全...原创 2018-04-24 00:11:41 · 117 阅读 · 0 评论 -
洛谷P1273 有线电视网
题目题解:f[t][j]表示i连接j个用户的费用(可能是负数) 初始化:f[i][0]=0,其他为负无穷 状态转移方程: 1.t为用户 f[t][1]=mon[t-n+m] 2.t不为用户 f[t][j]=max(f[t][j],f[t][j-k]+f[e[i].to][k]-e[i].w) e[i].to为连接的那个点,e[i].w为连接的费用标程:#include...原创 2018-04-23 15:29:58 · 113 阅读 · 0 评论 -
洛谷P1156 垃圾陷阱
题目题解:f[i][j]表示用了前i个垃圾,垫高j的高度后,还能存活的时间(注意:不是总共能存活的时间) 初始化:f[0][0]=10,其他都是负无穷 状态转移方程: 1.吃垃圾 f[i][j]=max(f[i][j],f[i-1][j]-a[i].T+a[i-1].T+a[i].F) 2.垃圾垫脚 f[i][j]=max(f[i][j],f[i-1][j-a[i].H]-a[...原创 2018-04-23 11:04:52 · 140 阅读 · 0 评论 -
洛谷P1220 关路灯
题目题解:易证:在某一时刻,关的路灯一定是连续的。 f[i][j][t]表示已经关了i….j的路灯,当前在i或j的最小功耗(t=0表示在i,t=1表示在j) 初始化:除了f[k][k][0,1]=0外,其他所有f[i][i][t]=inf 状态转移方程: t=s[n]-s[j]+s[i]; f[i][j][0]=min(f[i+1][j][0]+(a[i+1]-a[i])*t...原创 2018-04-23 09:24:03 · 179 阅读 · 0 评论 -
洛谷P3957 跳房子
普及组的题。。。 我不会。。。题解:思路很简单,就是二分答案+dp+单调队列(线段树也可以),但是要注意细节,一个细节错了,一半分数就没了。 引用洛谷上某大佬的一段话: 发现答案的可行区间是单调的,所以二分答案,容易推出f[i]表示到达第i个格子的最大值,枚举上一步跳了多少来转移 然后仔细观察可以发现对于一个状态,如果有比他后面的状态比他答案大的话,显然不会优..于是可以...原创 2018-05-15 21:19:51 · 386 阅读 · 0 评论 -
洛谷P3959 宝藏
有些人用模拟退火做,我一脸懵逼,于是还是老老实实用状压dp做吧。题解:f[x],dis[i]表示选点的状态为x,第i个点距离为dis[i]的最优答案 记忆化搜索标程:#include&lt;bits/stdc++.h&gt;using namespace std;int n,m,x,y,z,i,k,ans,dis[13],g[13][13],f[1&lt;&lt;13];...原创 2018-05-15 22:38:01 · 228 阅读 · 0 评论 -
洛谷P1034 矩形覆盖
题目做法1:dp官方题解 s[i][j]表示:以i和j为两个顶点的矩形面积 f[i][j][k]表示:k个矩形,覆盖了点i和点j之间所有点的矩形的最小面积#include<bits/stdc++.h>using namespace std;struct kk{ int x,y;}a[52];int s[52][52],f[52][52][6],n...原创 2018-06-03 21:17:44 · 267 阅读 · 0 评论 -
绍兴一中模拟赛7.6
T1:人类杀题目描述 因为吃完晚饭之后只有半个小时不够打狼人杀,某个天才设计了一个新游戏叫做人类杀。 有若干个狼人和一个人类,在晚上每个狼人依次醒来指票一个人,第二天白天吃票最多的人死亡。假如存在平票情况则无人死亡。狼人的游戏目标是找出那个人类然后杀掉。白天每个人都发一次言之后进入天黑。 小A正在旁观这个游戏,在一天白天每个人都发了言解释了夜晚时自己的票给了谁,假设所有狼人都说...原创 2018-07-06 19:42:16 · 253 阅读 · 0 评论 -
51nod1354 选数字
题目 题解 总感觉这个背包有点奇怪#include&lt;bits/stdc++.h&gt;using namespace std;const int M=1e9+7;map&lt;int,int&gt;tmp,mp;map&lt;int,int&gt;::iterator it;int T,n,k,i,t,a[1002];int main(){ scanf("%转载 2018-06-28 22:42:58 · 165 阅读 · 0 评论 -
51nod1048 整数分解为2的幂 V2
题目 题解 程序可以看我的,我的A了,当然,有些地方还可以优化,但我懒得优化了#include&lt;bits/stdc++.h&gt;using namespace std;typedef long long ll;const int M=1e9;char s[31];int tmp,i,j,k,tot;struct NUM{ int t;ll a[201];}f[...原创 2018-07-10 07:58:33 · 226 阅读 · 0 评论 -
51nod 1780 完美序列
题目 题解 先预处理出来每种大小的数的个数,并在这个过程进行判断是否连续(不大于 1),然后,我们可以从小到大进行插空法插数,那么如何插呢?假如,此时我们已经查到数 i,那么合法的插孔分为两种,第一种是插在两个i−1i−1 i−1 之间,另一种就是当首尾有i−1i−1 i−1 时,我们可以在首尾两侧进行插空。那么我们需要考虑的也就是此时考虑到了第iii 种数、有多少个相邻的第ii i 种数对儿...转载 2018-07-09 14:13:55 · 227 阅读 · 0 评论 -
bzoj2298: [HAOI2011]problem a
题目 题解 求最多说真话的人数,答案即为n-ans 设dp[i]表示在前i名中最多有多少人说真话 dp[i] = max{dp[j-1]+sum[j][i]} 其中sum[j][i]表示名次区间为[j, i]的人数#include<bits/stdc++.h>using namespace std;#define mp make_pairconst int N=1...转载 2018-07-09 10:47:37 · 170 阅读 · 0 评论 -
bzoj1044: [HAOI2008]木棍分割
题目 题解 f[i][j]=Σf[i−1][k]{k|sum[j]−sum[k]<=ans1}f[i][j]=Σf[i−1][k]{k|sum[j]−sum[k]<=ans1}f[i][j]=\Sigma f[i-1][k]\lbrace k|sum[j]-sum[k]原创 2018-06-30 10:55:42 · 140 阅读 · 0 评论 -
洛谷P2679 子串
题目题解:f[j][k]表示:一定取到a[i]时,在B的前j位中取了k个子串的方法数 g[j][k]表示:a的前i位,B的前j位取了k个子串的方法数(对是否取到a[i]没有要求) f[i][j][k]+=f[i-1][j-1][k](把这位接在原来的后面)+g[i-1][j-1][k-1](单独作为一个子串) g[i][j][k]+=f[i-1][j][k]+g[i-1][j][...原创 2018-05-31 21:46:02 · 155 阅读 · 0 评论