dp
GoLakerswxy
这个作者很懒,什么都没留下…
展开
-
统计合法序列数目
今晚hu老师发了我一道题目,好久没碰过了,没想到写了一下还ok。题意是时间限制:1.0秒空间限制:256MB输入m,n,x,y表示,序列长度是2*n,序列中最大数是m,合法序列定义:前n个数不下降,后n个数不上升,x和y位置的数相等。求和法序列的数目ans%998244353后的值。(其中 1≤x<y≤2n 1≤n,m≤10^5)样例1输入3213样例1输...原创 2020-04-25 21:38:14 · 251 阅读 · 0 评论 -
codeforces1013E(dp)
题目:n个hill,需要分别选出1...n/2个hill建造房子(满足高于左右两边的hill),每次可以把一个hill降低1个高度,问最少需要多少次操作,然后分别输出。思路:dp[i][j][k]表示前i个hill选了j个作为建房子的hill,当前这个hill选与不选的最少次数(k=1表示选,k=0表示不选)#include<bits/stdc++.h>using name...原创 2018-07-31 18:42:24 · 351 阅读 · 0 评论 -
HDU 6321Problem C. Dynamic Graph Matching(模拟,状压)
题目:给你n个点,m个操作,每种操作要么加一条边要么减一条边,紧接着询问当前选出1条无公共端点的边,2条无公共端点的边,3条.....n/2条无公共端点边时分别有多少种不同的选择。(n<=10) 思路:真是刺激,比赛时想到了状压没想到怎么搞,然后疯狂算暴力的复杂度。感觉还可以,应该不会T。交了一发,疯狂刷新后结果TLE。然后发现还可以优化下常数,直接把下面的代码写到init里面预处理出4...原创 2018-07-30 20:17:59 · 230 阅读 · 0 评论 -
POJ - 3252 Round Numbers (数位dp)
题目:找(A,B)区间内所有的数的二进制形式中0的个数比1的个数多的数字的数量。变成二进制,dp[pos][num0][num1]表示进行到pos这个数位时0的个数为num0,1的个数为num1时的值#include <cstdio>#include<cstring>using namespace std;typedef long long ll;ll A...原创 2018-07-23 09:34:14 · 129 阅读 · 0 评论 -
HDU - 4352 XHXJ's LIS (数位dp+状态压缩**)
题目:L到R,各位数字组成的严格上升子序列的长度为K的个数 (和LIS是一样不要求是连续的)思路:用十位二进制表示0--9出现的情况,用和O(nlogn)的LIS一样的方法进行替换更新。#include <bits/stdc++.h>using namespace std;typedef long long ll;ll A,B,dp[22][1<<10][1...原创 2018-07-22 21:17:52 · 194 阅读 · 0 评论 -
CodeForces 55D Beautiful numbers(数位dp+离散化*)
题目:求一个区间内的Beautiful numbers有多少个。Beautiful numbers指:一个数能整除所有组成它的非0数字。 例如15可以被1和5整除,所以15是Beautiful numbers。好久没写数位dp了,拿过一个来果断卡住了。。。求一下1...9的lcm,对1...lcm的能作为lcm因数的数标号hash,作为一个递归的关键字,然后不断对lcm取模的sum作为第二个...原创 2018-07-22 20:28:28 · 179 阅读 · 0 评论 -
牛客网多校2 travel(树形dp)
题目:给你一棵你个点的树,每个点有一个价值,选出三条不相交的链使得最后的总价值最大。显然是树形dp,我定义了一个三维的dp[i][j][k](i为子树id,j为选择了几条链,k为选择的j条链中是否包含了经过i点的直链)(0<=j<=3,0<=k<=1)。昨晚写这个题的时候一直就是过48%的数据,真是烦啊,今天发现定义一个全局变量的数组,里面递归时出错,真是无语了。改...原创 2018-07-22 13:03:24 · 441 阅读 · 0 评论 -
牛客网多校3 PACM Team(dp 多维)
题目:有n个物品,每个物品需要四种代价,分别需要ai,bi,ci,di。价值为val[i]。1<<36 ??? 我是智障!1ll<<36啊!!!不过比赛时好像过了。。过题也很无奈#include <bits/stdc++.h>using namespace std;typedef long long ll;int dp[2][40][40][4...原创 2018-07-26 20:02:54 · 302 阅读 · 0 评论 -
POJ - 1155 TELE (树形dp+背包)
题目链接点击打开链接题意:给定一棵树,1为根结点表示电视台,有m个叶子节点表示客户,有n-m-1个中间节点表示中转站,每条树边有权值。现在要在电视台播放一场比赛,每个客户愿意花费cost[i]的钱观看,而从电视台到每个客户也都有个费用,并且经过一条边只会产生一个费用。问电视台不亏损的情况最多有几个客户可以看到比赛?我把边权放到相连的子节点当变成点权存负值,dp[i][j]表示i这个节点要j...原创 2018-07-16 10:16:39 · 174 阅读 · 0 评论 -
CodeForce-219D Choosing Capital for Treeland(树形dp)
题目:给出一棵树,但是它的边是有向边,选择一个城市,问最少调整多少条边的方向能使一个选中城市可以到达所有的点,输出最小的调整的边数,和对应的点。(题意是copy别人的来的,自己说的太绕了)树形dp,dp[u]表示从u走到其所有的子节点需要的调整数,dpf[u]表示往父节点走需要的调整数,dp[u]+dpf[u]便是所有的调整数。dp[u]比较好求,dpf[u]+=dpf[father]; ...原创 2018-07-15 15:56:56 · 165 阅读 · 0 评论 -
51nod 1020 逆序排列(递推)
题目:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。1-n的全排列中,逆序数最小为0(正序),最大为n*(n-1) / 2(倒序)给出2个数n和k,求1-n的全排列中,逆序数为k的排列有多少种?例如:n = 4 k...原创 2018-08-10 10:32:56 · 257 阅读 · 0 评论 -
Beautiful Numbers (数位dp)
题目:找1...n之间能被自身digits和整除的数字有多少。就是一个简单的数位dp题,一共n最大1e12我特么以为是一共12位,直接开了个wei[13]的从1开始的数组。。脑子短路了感觉,想了好长一会才看到。。。写博客提醒下自己我好菜啊#include <bits/stdc++.h>using namespace std;typedef long long ll;ll...原创 2018-08-06 09:11:13 · 287 阅读 · 0 评论 -
HDU-6348 序列计数(dp+树状数组)
题目:度度熊了解到,1,2,…,n 的排列一共有 n!=n×(n−1)×⋯×1 个。现在度度熊从所有排列中等概率随机选出一个排列 p1,p2,…,pn,你需要对 k=1,2,3,…,n 分别求出长度为 k 的上升子序列个数,也就是计算满足 1≤a1 < a2 < … < ak ≤n 且 pa1 <pa2< … < pak 的 k 元组 (a1,a2,…,ak) ...原创 2018-08-06 11:23:16 · 464 阅读 · 0 评论 -
hdu 6212 Zuma(区间dp)
题目:一共有两种颜色的祖玛游戏,每三个连在一起(或者大于三个)的球球就会被消除掉,问将这个字符串消除干净的最小吐球个数。思路:区间dp,考虑几种情况,**** *****直接是两个组合,1***1中间挖掉一部分后两边合在一起,1***1***1中间挖掉两部分。#include<bits/stdc++.h>using namespace std;const int inf=...原创 2018-09-13 12:54:16 · 306 阅读 · 0 评论 -
hdu 5009 C -Paint Pearls (dp+模拟链表优化)
题目:有n个珠子需要染上特定的颜色,初始的时候是没有染色的,每次染的代价是染色区间中不同颜色数量的平方。思路:最极端的情况是每次拿一个点染色花费1,最终花费为n,所以这个题目最后dp[n]是不会超过n的,往前找转移的点时候只需要往前找到最多产生sqrt(n)的位置就可以了,因为再往前也是徒劳。维护每个数字出现的最后一次的位置,然后中间有些位置是空的啦,用双向链表维护前面那个不同数字最后出现在哪...原创 2018-09-07 11:52:05 · 243 阅读 · 2 评论 -
HDU - 5000 Clone (dp)
题目:克隆人有n个属性,给出每个属性的最大值T[i];属性值可以是0-T[i];如果A的所有属性都不比B低,那么B就不能存活,问最多存活多少人。思路:经过分析可以得到,让他们的属性和达到(T[1] + T[2].....+ T[n] )/2 也就相当于每个属性都取到平均值,无疑可以有更多人; 那么dp[i][j]就代表前i种属性,和达到j的有多少种。dp[i][j] += dp[i-1...原创 2018-09-17 22:16:38 · 238 阅读 · 0 评论 -
计蒜客 徐州网络赛 A.Hard to prepare (递推)
题目:n个人坐成一圈,每个人可以选0....2^k-1里面选一个数,问最后相邻的人的数字的xnor大于0的方案数有多少。思路:对于一个确定的k位的数,与它nxor值为0的数字只有一个,就是他的补码。然后对于一条直线来说再加一个满足条件的数的数量就是n-1了。现在这个题目是个圈。加一个数,需要考虑所加数与第1个数是否冲突,与第n-1个数是否冲突。如果第1个数与第n-1个数一样,那么第n-2...原创 2018-09-09 19:53:24 · 844 阅读 · 5 评论 -
HDU-6331Problem M. Walking Plan(dp,floyd)
题目:一个有向图,q组询问,每组询问(x,y,z)问从x到y至少经过z条路时的最短路径。思路:w[i][j]表示从i到j恰好经过1条路径的最短长度(就是原图)。 dpa[t][i][j]表示从i到j恰好经过t条路径的最短长度。 dpb[t][i][j]表示从i到j恰好经过100∗t条路径的最短长度。 最后floyd来更新dpb数组得到至少经过100∗t条道路的最短路. ans=mi...原创 2018-08-03 13:17:55 · 235 阅读 · 0 评论 -
HDU-6377度度熊看球赛(dp)
题目世界杯正如火如荼地开展!度度熊来到了一家酒吧。有 N 对情侣相约一起看世界杯,荧幕前正好有 2×N 个横排的位置。所有人都会随机坐在某个位置上。当然,如果某一对情侣正好挨着坐,他们就会有说不完的话,影响世界杯的观看。一般地,对于一个就座方案,如果正好有 K 对情侣正好是挨着坐的,就会产生 DK 的喧闹值。度度熊想知道随机就座方案的期望喧闹值。为了避免输出实数,设答案为 ans,...原创 2018-08-12 13:52:04 · 485 阅读 · 0 评论 -
HDU-6357 Hills And Valleys(dp)
题目:给你一个长度1e5仅有0...9数字组成的序列,允许你选任意一个区间然后反转一次,对于新的序列,求最长不下降子序列的长度,以及相应的反转的区间(l,r).思路:大概最长不下降序列的总体变化趋势是0,1,2.....8,9,设为s数组。反转a数组相当于找s数组的两个端点反转一下变成:0,1,2,…x−1,x, (y,y−1,y−2,……,x+1,x,) y,y+1,……8,9 ...原创 2018-08-07 19:11:38 · 189 阅读 · 0 评论 -
BZOJ-1833 count 数字计数 ( 数位dp )
题目:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。思路:数位dp,sum表示digit出现的次数,num表示有多少个数。前导0需要注意下。#include <bits/stdc++.h>using namespace std;typedef long long ll;int wei[15],k;ll a,b,ans[15...原创 2018-08-07 10:35:22 · 317 阅读 · 0 评论 -
poj-1742Coins (多重背包的可行性问题)
题目:从价值和数量分别为a[i]和c[i]的n种硬币中,最多可以组成多少不超过m价值的组合?也就是问在1-m中,有多少个数可以由这些硬币加和得到。(楼教主的男人八题之一,算是一类经典问题)与多重背包问题很相似,但是用多重背包直接dp或者简单优化的dp很可能会T。(感觉自己都会写,其实不是那么一回事,并不代表就能AC)dp[i][j]表示前i种硬币构成j的钱数时,第i种硬币还剩多少,(不...原创 2018-07-20 21:29:23 · 319 阅读 · 1 评论 -
牛客网多校1 Symmetric Matrix(递推)
题目:构造一个n*n的矩阵,使得Ai,i = 0,Ai,j = Aj,i,Ai,1+Ai,2+...+Ai,n = 2。求种类数。题解: 把构造的矩阵当成邻接矩阵考虑。那么所有点的度数都为2,且存在重边但不存在自环。这种情况的图为多个环,即每个点都在且仅在一个环里。考虑每次加一个点来递推dp[]。假设当前是第n个点,从前n-1个点中筛出(1~n-3)个点和第n个点形成环。设n-1个点中保...原创 2018-07-20 19:24:33 · 429 阅读 · 0 评论 -
POJ - 3162Walking Race(树形dp+单调队列)
题意:给一棵n个结点边带权的树,记结点i到其他结点最远距离为d[i]。问d数组构成的这个序列中满足其中最大值与最小值的差不超过m的连续子序列最长是多长。用树形dp来求树中的每个顶点到其他所有顶点距离的最大值。然后用单调队列求满足max-min<=m的连续子序列最长是多长。//#include <bits/stdc++.h>#include<iostream&...原创 2018-07-15 14:10:01 · 245 阅读 · 0 评论 -
The 2018 ACM-ICPC CCPC宁夏 G-Factories(树形dp+背包)
题目:给你n个城市,n-1条道路,每两个城市仅有一条通路,即一个树形结构。让你选择m个叶子节点建立工厂,使得最终任意两个工厂之间距离的累加和最小。思路:考虑点之间的关系很繁琐,所以我想的是对于一条边来说考虑经过了它多少次。dp[u][i]表示u节点为根的子树上选择了i个叶子节点,会经过u这个子树的边的权值和的最优值。转移方程如下:dp[u][i]=min( dp[u][i-j]+dp[v]...原创 2018-07-17 19:35:38 · 2235 阅读 · 0 评论 -
HDU - 3709 Balanced Number(数位dp,注意前导零)
题目:给定区间[a,b],求区间内平衡数的个数。所谓平衡数即有一位做平衡点,左右两边数字的力矩相等。思路:dp[pos][k][sum]代表进行到pos位,以k位为平衡点时,加和为sum时的答案。#include <bits/stdc++.h>using namespace std;typedef long long ll;int t,k,wei[22];ll A,...原创 2018-07-23 10:21:22 · 528 阅读 · 0 评论 -
HDU - 3586 Information Disturbing(树形dp+二分)
题目:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线。现要切断前线和司令部的联系,每次切断边的费用不能超过上限limit,问切断所有前线与司令部联系所花费的总费用少于m时的最小limit。(1<=n<=1000,1<=m<=1e6)二分limit,dp[u]表示去除了子树u的所有叶节点的最小花...原创 2018-07-16 21:56:41 · 178 阅读 · 0 评论 -
HDU - 1011Starship Troopers (树形dp+背包)
题目:带领m个士兵,存在n个房间(n-1条通路,1号房间为起点);每个房间有两个参数:bugs数以及价值。每个士兵可以抵抗20个bugs,参与抵抗的士兵不继续往下走,只有消灭房间中的所有bugs,才可以得到该房间的价值。要到达下一个房间,必须先将当前房间的bugs全部消除;并且走过的房间就不再到达。问有m个士兵的情况下,怎样使最后得到的价值最大,最大为多少?f(i, j) = max {...原创 2018-07-16 19:57:17 · 179 阅读 · 0 评论 -
POJ - 1947Rebuilding Roads(树形dp)
题目 给你n个节点的一颗树,问你最少切断几条边使得能独立出一个节点数为m的子树。dp[i][j]表示生成一个以i为根有j个节点的子树需要切断的最少的边数#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>...原创 2018-07-16 12:36:35 · 155 阅读 · 0 评论 -
CodeForces - 834E 暴力枚举+数位dp
定义f(n)为数字n的十进制表示的所有非0数码组成的多重集,求 L<=n<=R 中不同的f(n)的数量。1e18内出现的所有f(n)一共最多C(27,9)种,暴力枚举每一种,然后check一下是否能组成在(L,R)区间内的数。这时候用到了数位dp。如下#include<bits/stdc++.h>using namespace std;typedef ...原创 2018-06-08 17:49:24 · 305 阅读 · 0 评论 -
CodeForces - 834D(线段树优化dp)
给你长度为N的一个序列,让你将其分成连续的k段,每段的价值为其中数字种类的个数,求最大价值总和。 首先能想到n^2复杂度的dp设定dp[i][j]表示到位子i,分成j段的最大价值总和。dp[i][j]=max( dp[i][j],dp[k][j-1]+val(k+1,i) );k为这个数上一次出现的位置可以用线段树加速转移。考虑val(k+1,j).我们遍历到第j个位子...原创 2018-06-21 17:45:21 · 536 阅读 · 0 评论 -
HDU - 2196(树形dp)
给出一颗树,求树中的每个顶点到其他所有顶点距离的最大值。经典树形dp#include <bits/stdc++.h>using namespace std;const int maxn=1e4+100;int n,dp[maxn],dpf[maxn],f[maxn][3];//dp为孩子节点到这个点的最远距离,dpf为父节点到这个节点的最远距离,最后取maxstru...原创 2018-06-05 20:46:20 · 629 阅读 · 0 评论 -
hdu 1693 插头dp
在n*m的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少种方法。 #include <bits/stdc++.h>using namespace std;typedef long long ll;int t,a[13][13],n,m;ll dp[13][13][1<<13];int main(){ ...原创 2018-05-13 17:03:37 · 179 阅读 · 0 评论 -
POJ - 3107 Godfather(树形dp,找树的重心)
题目:就是找树的重心,可能存在多个,按编号从小到大输出。一个水题,但是好几个罚时....不能用vector存边,会TLE.#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace...原创 2018-07-17 20:16:31 · 252 阅读 · 0 评论 -
HDU-4734 F(x) (数位dp*)
题意:定义 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1(其中 x = AnAn-1An-2 ... A2A1),那么给定A,B,求[0,B]区间的i,满足F(i)<=F(A);dp[pos][sum]表示跑到当前位,还剩sum值没用完时的答案。sum<0的时候一定不能忘记判断啊。。。#include <b...原创 2018-07-23 21:31:21 · 194 阅读 · 0 评论 -
LightOJ - 1364 Expected Cards (概率期望)
题目:给你一副扑克牌,54张,让你求出取出黑梅红方最少分别为a,b,c,d张 的取的次数的期望。其中大小王可以当做四种牌的任意一种。题解:dp[a][b][c][d][p][q]表示每种牌分别有a,b,c,d张,Joker的状态分别作为p和q出现时的期望值,然后记忆化搜索。(dp状态想到了,但是没能实现,参考一位大佬的方法%%%%%)#include<bits/stdc++.h&g...原创 2018-07-25 21:33:23 · 505 阅读 · 0 评论 -
牛客网多校1 Removal(dp)
题目:给你一个n长度的序列s,删除m个数后产生的序列有多少种?(n<=1e5,m<=10,si<=10)dp[i][j]表示i长度,以j数字结尾的方案数#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod=1e9+7;const int maxn=1...原创 2018-07-20 14:36:58 · 270 阅读 · 0 评论 -
LightOJ - 1287 Where to Run (概率期望*)
题目:有一个小偷要遍历n个城市,每个城市只能走一次,在一个城市他可以选择在这等待5分钟或者选择下一个城市(条件是这下一个城市能把剩下的城市都走完)走,选择某下一个城市与当前停留在原点是等概率的,求遍历完整个图的期望时间。思路:一共15个城市可以想到状压,dfs一遍把所有的城市的状态都判断下能不能到达vis[u][s],和这种状态下有多少个选择cnt[u][s],然后dp[u][s]表示遍历到u...原创 2018-07-25 09:31:37 · 355 阅读 · 0 评论 -
LightOJ - 1284 Lights inside 3D Grid(概率期望)
题目:在一个三维的空间,每个点都有一盏灯,开始全是关的.现在每次随机选两个点,把两个点之间的全部点,开关都按一遍;问m次过后开着的灯的期望数量。思路:一个点如果被包到所选空间里,那么说明选的两个点,x坐标在这个点两侧,y坐标在这个点两侧,z坐标在这个点两侧;对于一维的,可以用求出两个点在x这一点两侧的概率。然后三维的只要当成三个一维的乘起来就行了。#include<bits/s...原创 2018-07-24 18:28:00 · 284 阅读 · 0 评论 -
LightOJ - 1265 Island of Survival(概率期望)
题目:有 t只老虎,d只鹿,还有一个人,每天都要有两个生物碰面,现在有以下规则:老虎不管碰到谁都吃掉,同类的话就同归于尽。问人存活下来的概率。直接把鹿忽略掉,人存活下来的可能性只有一种就是到最后老虎自相残杀,如果老虎有奇数个那么人一定死,偶数个时候,总的碰面可能有C(t+1,1)种(从t+1个动物中选出一个直到最后也不碰面),人最后活着的可能有1(人坚持到最后)。所以概率就是1/(t+1)....原创 2018-07-24 15:53:30 · 480 阅读 · 0 评论