--dp(动态规划)---
a1s4z5
这个作者很懒,什么都没留下…
展开
-
Bzoj 3875 骑士游戏
DP的本质是DAG上的最短路。但是如果不是DAG呢?那些常用的最短路算法,比如spfa或者是Dijkstra就可以了。感觉打开了新世界的大门。对于这个题来说,我们需要维护一个查分。具体的处理过程见代码#include<bits/stdc++.h>using namespace std;const int maxn = 212345;#define LL long long LL mag[maxn原创 2016-11-16 11:21:05 · 424 阅读 · 0 评论 -
hdu 5279 Rigid Frameworks
照着题解敲过了这个题。。给出一个转移dp(i,j)=3i×j−∑1≤a≤i,0≤b≤j,a<i∨b<j(i−1a−1)(jb)×3(i−a)×(j−b)×dp(a,b)dp(i,j) = 3 ^{i\times j} - \sum\limits_{1 \le a \le i,0\le b\le j,a < i \lor b<j} \binom{i-1}{a-1}\binom{j}{b}\times原创 2016-07-20 20:51:00 · 343 阅读 · 0 评论 -
poj 2057 The Lost House
论文题,树dp多说两句,这个题的决策是在一个节点时选择子节点遍历的顺序通过贪心来优化dp#include<cstring>#include<cstdio>#include<vector>#include<cstring>#include<algorithm>using namespace std;const int maxn = 1123;vector<int> edge[maxn];vo原创 2016-07-18 21:26:36 · 275 阅读 · 0 评论 -
Poj 1947 Rebuilding Roads
树dp+背包考虑是否加入子树k 时间复杂度O(n3)O(n^3)#include<cstdio>#include<vector>#include<algorithm>#include<cstring>using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 200;vector<int> edge[maxn];int原创 2016-07-18 09:16:27 · 232 阅读 · 0 评论 -
Hdu 5731 Solid Dominoes Tilings
问n×m n \times m的格子铺上1×21 \times 2的骨牌使得对于任何一条行/列分割线都会跨越骨牌定义anyn,many_{n,m} 为用骨牌铺满n×m n \times m的格子在不考虑题目条件的方案数然后容斥容斥的时候我们列举列分割线,求在当前枚举的列分割线存在的情况下没有行分割线的方案数,然后按照枚举的分割线的方案数做一个奇加偶减的容斥就好具体的,我们假设分割线分隔出来的块共p原创 2016-07-28 09:23:03 · 582 阅读 · 1 评论 -
poj 2411 Mondriaan's Dream
人生第一个插头DP(基于轮廓线的状态压缩动态规划虽然这个题好像有别的姿势,不过在学习了插头dp之后还是练习了一下插头dp入门看 基于连通性状态压缩的动态规划问题这个课件就好就好#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL long long const int bit=原创 2016-07-25 19:33:33 · 287 阅读 · 0 评论 -
hdu 5735 Born Slippy
hdu 5739 Fantasia偷偷放上题解 -by zimpha 感谢叉姐在ICPCCamp上出的这道题最初的原型 – Data Structure You’ve Never Heard Of, 同样感谢Claris老师的教导. 由于and, or和xor方法都差不多, 这里仅考虑and操作. 不妨令dp(s)=f(s)−wsdp(s)=f(s)-w_s, 我们大概要求的就是dp(i)原创 2016-07-25 10:46:31 · 553 阅读 · 0 评论 -
Ural 1303 Minimal Coverage
在至多1e51e5条线段(端点范围|l,r|≤50000|l,r|\le50000)中选出一些使得这些线段能覆盖[0,m][0,m](可以重叠覆盖)如果选不出来输出No solution,如果能选出来要求选出的线段条数最小,并且输出选出的线段还是比较简单的一个dp记dpxdp_x为能覆盖[0,x][0,x]的最少的线段集合的大小对于一个点为l,rl,r的线段,dpdp状态的转移为dpx=min(dp原创 2016-06-13 17:17:53 · 288 阅读 · 0 评论 -
Ural 1658 Sum of Digits
求最小的,各个数位的和为S1S_1,各个数位的平方和为S2S_2的数一眼看下来只会求方案数啊GG,最小的该怎么办呢然后可以想到如果一个数的位数少,他肯定是短的所以我们要找到最短位的那个数应该就是答案了dp的时候顺便维护一下是用哪个数字转移过来的,回溯过去记录答案最后再把拥有的数从小到大排一下,应该就是最优的了但是这样空间复杂度是1e10啊QAQ,还是要GG啊你或许注意到了,要是数位大于100,也是无原创 2016-05-23 21:19:42 · 379 阅读 · 0 评论 -
Ural 1081 Binary Lexicographic Sequence
数位dp+二分找出第k个二进制表示中没有相邻的1的数看起来很不好做是不是,但是作为数位dp,我们还是可以处理小于x的二进制表示没有相邻1的数个数这部分还是挺简单的?然后我们就可以二分去找答案了~感觉这个都是套路,还是见代码吧o(` • ~ • ′。)o #include<bits/stdc++.h>using namespace std;#define LL long longconst in原创 2016-05-23 17:24:11 · 313 阅读 · 0 评论 -
Hdu 5155 Harry And Magic Box
在n×mn \times m的盒子中有多少种放置石头的方案使得每一行每一列都至少有一个石头(0≤n,m≤50)(0 \le n,m \le 50)这个dp计数的状态感觉也是十分的炫酷dpi,jdp_{i,j}表示前ii行每一行都至少有一个石头并且有且仅有jj列有石头(也就是剩下m−jm-j列都是空列)的方案数。这样的话答案就是dpn,mdp_{n,m}然后我们考虑状态转移,考虑状态dpi,jdp_{原创 2016-06-10 15:23:20 · 489 阅读 · 0 评论 -
Astar Round2A 1002
状压dp因为nn比较小,我们可以考虑O(2n)O(2^n)的算法(也就是状态压缩具体的,dpmask,ed,lendp_{mask,ed,len}表示填了第00到lenlen个数,最后一个数是第eded个,前面用的数在maskmask里面的最优解因为题目中有限制某一些位必须是某一些数,所以在转移过程中如果有当前的ed!=musted!=must的时候,直接返回一个不可能的值其它的直接去dfsdfs过原创 2016-05-21 18:10:44 · 324 阅读 · 0 评论 -
Ural 1036 Lucky Tickets
简单的dpss为奇数时答案为00ss为偶数时答案为长nn的各位之和为s/2s/2的方案数的平方状态其实就是长度和位和,然后转移一下就好了dpn,s=∑k=09[n≥1][s≥k]dpn−1,s−kdp_{n,s}=\sum\limits_{k=0}^9[n \ge 1][s\ge k]dp_{n-1,s-k}因为方案数会超过longlonglong\;long 的表示范围,而且这个题不取模,所以需要原创 2016-05-21 12:06:12 · 592 阅读 · 0 评论 -
Lonlife 1016 Change of Life
定义f(x)f(x)为LIS(a0,a1...am)(n=a0+a1×10+...+am×10m,0≤ai≤9,am≠0)LIS(a_0,a_1...a_m)(n = a_0 + a_1\times 10+...+a_m\times 10^m,0\le a_i\le 9,a_m\neq 0)求∑ni=1f(i)\sum_{i=1}^nf(i)1≤n≤10151 \le n \le 10^{15}一眼原创 2016-10-09 09:56:36 · 297 阅读 · 0 评论 -
bzoj 3238 差异
给出一个长n的字符集为小写字母的字符串,求∑1≤i<j≤nlen(Suffixi)+len(Suffixj)−2×len(lcp(Suffixi,Suffixj))\sum \limits _{1 \le i < j \le n} len(Suffix_i) + len(Suffix_j) - 2 \times len(lcp(Suffix_i,Suffix_j)) SuffixxSuffix_x原创 2016-09-07 19:35:41 · 472 阅读 · 0 评论 -
Codeforces 349D - Apple Tree
有一个有根树,每个叶子节点都有一定量的苹果(可能为0),非叶子节点上没有苹果。一个节点的重量定义为在以这个节点为根的子树内的节点的苹果个数和。对于一个节点称它是平衡的当且仅当这个节点的每个子节点的重量都相等。问最小需要拿走多少个苹果才能令所有节点都平衡。假设我们已经将一个子树拿成了平衡的,这个子树的父节点需要这个子树继续拿走苹果的时候,苹果是一份一份拿的,一份中含有的苹果的个数依赖于这个子树的形态。原创 2016-11-02 11:32:06 · 573 阅读 · 0 评论 -
Codeforces 347D - Lucky Common Subsequence
给出两个长100100的字符串aa,bb。再额外给出一个长100100的字符串 virusvirus。询问aa和bb最长的没有字串是virusvirus的公共子序列。输出这个子序列。在经典的LCSLCS的dpdp解法上再加一维,记录当前的最长公共子序列匹配virusvirus的长度。第三维转移可以用KMPKMP或者ACAC自动机。#include<bits/stdc++.h>using names原创 2016-10-31 13:39:36 · 490 阅读 · 0 评论 -
Codeforces 258B - Little Elephant and Elections
从[1,m][1,m]中依次选择77个数,满足前六个数中44和77的个数之和小于最后一个数的44和77的个数的方案数(mod1e9+7)\pmod{1e9+7}我们按照4和7的个数对[1,m]的数做等价类划分。然后dfs就好。前半部分可以用数位dp解决。#include<bits/stdc++.h>using namespace std;const int maxn = 12,mod = 1e9+原创 2016-10-08 08:40:15 · 374 阅读 · 0 评论 -
Hdu 5890 Eighty seven
有50个数,每次拿走至多三个数询问是否存在十个数满足和等于87。可以用bitset压位跑一个背包抠一抠常数就能过去惹#include<bits/stdc++.h>using namespace std;const int maxn = 55;int var[maxn];int n;int ans[maxn][maxn][maxn];bitset<88>dp[10];bool cal(){原创 2016-10-19 17:37:19 · 301 阅读 · 0 评论 -
Poj 3208 Apocalypse Someday
求第nn小的数位中含有三个连续的6的数。考虑小于xx的数位中含有连续三个6的数的个数,可以数位dp。状态为之前连续的6的个数,如果已经有三个6了,无论加什么数字都是合法状态,否则加一个不为6的数就重置个数为0。然后二分就好了#include<cstdio>#include<cstring>using namespace std;#define LL long long const int ma原创 2016-10-19 17:12:10 · 415 阅读 · 0 评论 -
Hdu 5456 Matches Puzzle Game
问有多少个等式满足使用的火柴棍个数恰好为nn个输出等式个数(modm)\pmod{m}5≤n≤500,3≤m≤2×1095\le n \le 500,3 \le m \le 2\times 10^9就是求满足a+b=ca + b = c,并且a,b,ca,b,c每一位按照使用的火柴棍个数加权之后恰好等于n−3n-3的等式个数考虑到这个题的状态和之前使用了多少位无关并且保证剩下的火柴棍是单调递减的可以原创 2016-10-06 17:20:36 · 540 阅读 · 0 评论 -
Hdu 5921 Binary Indexed Tree
题解链接题意搬运: 用树状数组维护一个序列,在给区间 [l,r][l,r] 加上一个tt的时候,要给 [1,r][1,r]加上 tt,给 [1,l−1][1,l−1] 减去 tt,两次操作后值真正发生变化的节点个数就是这一次区间修改的代价,现在要修改每一个[1,n][1,n]的子区间,求总代价对 109+710^9+7取模后的结果。题解搬运 记cnticnt_i表示ii的二进制表达式中11原创 2016-10-05 21:53:14 · 1546 阅读 · 0 评论 -
Hdu 5909 Tree Cutting
n(n≤1000)n(n\le 1000)个点的树上每个点有一个权值(0≤Ci<m,m≤210)(0\le C_i < m,m\le 2^{10}),定义一个子树的权值为这个子树节点的权值的异或。分别求权值为[0,m−1][0,m-1]的子树的个数mod(109+7)mod(10^9+7)对于一个无根树的子树,如果我们钦定一个点作为无根树的根,那么对于这个树的所有子树都可以钦定出唯一的一个点作为根。原创 2016-10-02 23:20:15 · 959 阅读 · 0 评论 -
Hdu 4507 吉哥系列故事——恨7不成妻
Hdu 4507 吉哥系列故事——恨7不成妻求[L,R][L,R]中不满足以下任意一条的数的平方和1 整数中某一位是72 整数的每一位加起来的和是7的整数倍3 这个整数是7的整数倍;一眼看去又是一个数位dp,但是怎么统计平方和呢?假设我们在统计最高位为x的n个数的平方和有∑i=1n(x+a)2=n×x2+2x×∑i=1nai+∑i=1na2i\sum\limits_{i=1}^n ( x + a )原创 2016-10-09 10:15:56 · 341 阅读 · 0 评论 -
Hdu 4804 Campus Design
有一个n×m(n≤100,m≤10)n\times m(n\le 100,m\le10)的棋盘,除了一些不能被覆盖的位置外其他的地方用1×21\times2和1×11\times1的骨牌填满,1×11\times1的骨牌使用次数在[C,D][C,D]之间。问满足条件的方案数(mod109+7)\pmod {10^9+7}一个简单的插头dp入门题。不能覆盖的地方可以视作必须放下1×11\times 1原创 2016-11-04 16:19:36 · 319 阅读 · 0 评论 -
Codeforces 55D - Beautiful numbers
统计[L,R][L,R]内能被自己每一非零位整除的数的个数。一眼数位dp考虑到LCM(1,2...9)=2520LCM(1,2...9) = 2520可以用前缀mod2520和前缀非0数的LCM做为状态注意到由1到9组成的lcm其实是很稀疏的,可以离散化一下。具体就见代码吧。#include<bits/stdc++.h>using namespace std;const int maxn = 20原创 2016-10-12 17:57:21 · 341 阅读 · 0 评论 -
Bzoj 3530 数数
求[1,n](n≤101000)[1,n](n\le 10^{1000})中不包含给定数字作为字串的数字个数(mod109+7)\pmod{10^9+7},给定数字总长度≤1500\le 1500。一眼看过去是一个用AC自动机表示状态,用数位dp的模板题注意前导零是不会被统计到的具体见代码#include<bits/stdc++.h>using namespace std;const int ma原创 2016-10-11 16:54:04 · 299 阅读 · 0 评论 -
hdu 4899 Hero meet devil
给出一个模式串S,|S|≤15S,|S| \le 15问存在多少个长为m,m≤1000m,m\le 1000的字符串TT满足LCS(S,T)=x(0≤x≤|S|)LCS(S,T) = x(0\le x\le|S|)输出|S|+1|S|+1个结果(mod109+7)\pmod{10^9+7}|S||S|表示字符串SS的长度本题中的字符集为A,T,C,GA,T,C,G四个字母算是一个dp of dpdp原创 2016-09-20 20:37:08 · 518 阅读 · 0 评论 -
bzoj 4513 储能表
一句话题面∑x=0n−1∑y=0m−1min(x⊕y−k,0)(modp)\sum\limits_{x=0}^{n-1}\sum\limits_{y=0}^{m-1}min(x\oplus y-k,0) \pmod{p}好的题面就到这里数位dp一下就好记忆话搜索的时候其实用不着很多的分类讨论,具体的看代码吧#include<bits/stdc++.h>using namespace std;#de原创 2016-05-07 23:08:05 · 1380 阅读 · 0 评论 -
HDU 4734 F(x)
一个简单的数位dp这题的时间卡的有点紧,因为T比较大刚开始每组输入都重新计算dp数组,然后喜闻乐见的T了好久重新设计状态让计算出来的dp数组和A无关,这样就可以多次利用了 #include<bits/stdc++.h>using namespace std;#define LL long longconst int maxn = 20;int tw[maxn],num[maxn];int dp原创 2016-05-07 10:43:42 · 394 阅读 · 0 评论 -
poj 2114 Boatherds
和上一个题几乎一致的树分治题(判断树上是否有权值和等于k的路径一样的树分治具体见代码#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn = 11234;vector<pair<int,int> >edge[maxn];void init(原创 2016-05-16 17:43:17 · 245 阅读 · 0 评论 -
UESTC 250 windy数
人生第一个数位dp成就达成!#includeusing namespace std;#define LL long longLL dp[15][10][2];int dig[15];LL dfs(int pos,int pre,bool limit,bool leadz){ if(pos < 0) return 1; if(!limit原创 2016-03-11 21:49:26 · 513 阅读 · 0 评论 -
Poj 1185 炮兵阵地
简单的状压dp因为炮兵的攻击范围是两格,所以状态要多开一维#include#include#includeusing namespace std;const int maxn = 200;const int log = 11;int dp[maxn][maxn][maxn];char Map[maxn][log];int bmap[maxn];voi原创 2016-02-23 15:41:59 · 288 阅读 · 0 评论 -
hdu 3652 B-number
又是一个数位dp入门题,求1到n中含有13作为子串而且能被13整除的数的个数具体见代码吧#include#include#includeusing namespace std;const int maxn = 15;int dp[maxn][maxn][maxn][maxn];int dig[maxn];int dfs(int pos,int pre,in原创 2016-03-19 11:08:26 · 391 阅读 · 0 评论 -
Ural 2072 Kirill the Gardener 3
给出一个数组,vali..nval_{i..n} 求一个该数组排列,ord1..nord_{1..n},满足∀i∈[1,n),valordi≤valordi+1\forall i\in[1,n),val_{ord_i}\leq val_{ord_{i+1}},并且使得∑i=1n−1abs(ordi−ordi+1)\sum\limits_{i=1}^{n-1}abs(ord_i - ord_{i+原创 2016-03-18 21:16:43 · 786 阅读 · 0 评论 -
Poj 3254 Corn Fields
一个简单的状态压缩DP按行压缩按列压缩都可以会状压DP了这个就是水题#include#includeusing namespace std;#define LL long longconst LL mod = 100000000;const int Log = 13;const int maxn = 1<<Log;LL dp[Log][max原创 2016-02-19 20:35:56 · 284 阅读 · 0 评论 -
SRM 682 Div2 1000 SubtreesCounting
题面:定义一个树的valuevalue为树的所有联通子图的节点数之和 求给出的一个树的valuevalue感觉很巧妙的一个树dp树dp因为是一个无根树,不妨把0号节点提起来作为根,记TxT_x为以xx为根节点的子树定义 SxS_x为在TxT_x中选择xx的valuevalue 定义CxC_x为在TxT_x中选择xx的联通子图的个数那么,考虑给每次新#include <bits/stdc++.h原创 2016-03-03 18:35:16 · 384 阅读 · 0 评论 -
Ural 2018. The Debut Album
给你一个长度n,和两个小于n的整数a,b连续的1的个数不超过a个,连续的0的个数不超过b个的长为n的01串的总数,答案对10^9+9取模-----------------------------------我是分割线---------------------------------------------------------定义dp[bit][i][j]是以原创 2015-08-03 06:40:37 · 428 阅读 · 0 评论 -
ural 1260. Nudnik Photographer
这题吧。。。怎么说呢。。。。题意是给你一个N,求1到N的排列的数目排列有两个要求 1:必须以1为开头2:相邻两个数之差不得大于23:没了-------------------以下是思路----------首先是观察手写了长度从1到7的排列(我写了四遍我会说每次N的增加就是从1~(N-1)的排列中插入一个N而N插入的位置只和(n-1)还有(n-原创 2015-01-29 21:11:41 · 496 阅读 · 0 评论 -
URAL 1119 Metro
简单的dp题目大意是给一个网格然后有一些近路求从(0,0)到(M,N)的最短距离-------------------------------解释题目的分割线----------------------嘛很显然每个非边界的点可以从下面的点或者左边的点走过来特别的 如果有近路 还要考虑近路在这几个情况中取得最小值那么有状态转移式 dp[i][j]=min(dp[原创 2015-01-22 15:16:10 · 322 阅读 · 0 评论